扫码加入

ElfBoard

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
  • 飞凌嵌入式ElfBoard-文件的时间属性之utimes
    设置文件的访问时间和修改时间(微秒级别) 1.头文件 #include <sys/time.h> 2.函数原型 int utimes(const char *filename, const struct timeval times[2]); 3.参数 filrname:要修改时间的文件名。 times:是一个包含两个 struct timeval 的数组,第一个表示访问时间,第二个表示
  • 飞凌嵌入式ElfBoard-获取文件的状态信息之文件权限
    前面介绍的struct stat结构体中st_mode字段记录了文件的类型和文件的访问权限。因为Linux系统是由文件构成的,所以这里的文件权限适用于Linux系统所有的文件,包括目录、文件、设备、软连接等等,这里就不一一列举了。在这些权限中分为普通权限和特殊权限。 这里讲的普通权限就是前面的st_mode字段中所说的文件所有者权限、同组用户权限和其他用户权限,下面来回忆一下这些权限有什么内容:
  • 飞凌嵌入式ElfBoard-获取文件的状态信息之fstat
    fstat函数用来获取已经打开的文件描述符相关的文件状态信息。 1.头文件 #include <sys/stat.h> 2.函数原型 int fstat(int fd, struct stat *statbuf); 3.参数 fd:文件描述符,表示已打开的文件。 statbuf:指向 struct stat 结构的指针,用于存储文件的状态信息。 4.返回值 若成功返回0,失败返回-1
  • 飞凌嵌入式ElfBoard-Linux系统中的文件分类
    从本质上讲,Linux系统就是由文件组成的,一切皆文件是linux系统设计的核心理念,接下来介绍一下文件类型的种类: 1.普通文件: 指用户存储数据的标准文件,如平时经常见到的.c、.h、.txt、.sh、.log和.bin文件,这里面除了.bin文件是二进制文件,其他的都是文本文件。 文本文件就是常说的ASCII码字符组成的,这样就方便了人阅读或者修改。 二进制文件就如同名字一样,里面存储的为二
  • 飞凌嵌入式ElfBoard-获取文件的状态信息之stat
    用来获取文件的详细状态信息。它可以用来检索与文件相关的属性,如文件的权限、所有者、大小、时间戳等信息。 1.头文件 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> 2.函数原型 int stat(const char *pathname, struct stat *statbuf)
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之文件锁
    前面有讲过竞争冒险的问题,如果有多个进程对文件进行I/O操作,容易产生竞争状态、导致文件中的内容与预想的不一致的问题,由此引入文件锁。 内核提供的锁机制用于对共享资源的访问进行保护,而文件锁是一种应用于文件的锁机制,当多个进程同时操作同一文件时,对文件上锁,来避免多个进程同时操作同一文件时产生竞争状态。 文件锁可以分为建议性锁和强制性锁两种: 建议性锁本质上是一种协议,程序访问文件之前,先对文件上
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之I/O多路复用
    I/O多路复用(IO multiplexing)通过一种机制,可以监视多个文件描述符,一旦某个文件描述符(也就是某个文件)可以执行I/O操作时,能够通知应用程序进行相应的读写操作。I/O多路复用技术是为了解决:在并发式I/O场景中进程或线程阻塞到某个I/O系统调用而出现的技术,使进程不阻塞于某个特定的I/O系统调用。 由此可知,I/O多路复用一般用于并发式的非阻塞I/O,也就是多路非阻塞I/O,比
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之异步I/O
    在I/O多路复用中,进程通过系统调用select或poll来主动查询文件描述符上是否可以执行I/O操作。而在异步I/O中,当文件描述符上可以执行I/O操作时,进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务直到文件描述符可以执行I/O操作为止,此时内核会发送信号给进程。 异步I/O通常也称为信号驱动I/O。 要使用异步I/O,程序需要按照如下步骤来执行: 1.通过指定O_NON
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之存储映射I/O
    存储映射I/O(memory-mapped I/O)是一种基于内存区域的高级I/O操作,它能将一个文件映射到进程地址空间中的一块内存区域中,当从这段内存中读数据时,就相当于读文件中的数据(对文件进行read操作),将数据写入这段内存时,则相当于将数据直接写入文件中(对文件进行write操作)。这样就可以在不使用系统I/O操作函数read和write的情况下执行I/O操作。 普通I/O方式一般是通过
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之阻塞I/O与非阻塞I/O
    1.4.1.1 概念 阻塞I/O顾名思义就是对文件的I/O操作是阻塞式的,即假如对某些类型文件(管道文件、网络设备文件和字符设备文件)进行读操作时,如果数据未准备好、文件当前无数据可读,那么读操作可能会使程序阻塞等待,直到有数据可读时才会被唤醒返回。 普通文件的读写操作是不会阻塞的,不管读写多少个字节数据,read或 write一定会在有限的时间内返回,所以普通文件一定是以非阻塞的方式进行I/O操
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之fcntl和ioctl
    fcntl 用于对一个已经打开的文件描述符执行一系列控制操作,比如复制一个文件描述符(与 dup、dup2 作用相同)、获取/设置文件描述符标志、获取/设置文件状态标志等。 1.头文件 #include <unistd.h> #include <fcntl.h> 2.函数原型 int fcntl(int fd, int cmd, ...) 3.参数 fd:表示要操作文件的文
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之原子操作
    原子操作指的是不可被中断或分割的基本操作,它在执行过程中要么完全执行成功,要么完全不执行,不会被其他并发操作所干扰。 原子操作是确保对共享资源进行并发访问时线程安全的关键,通常由硬件或操作系统提供支持,并且能够保证在多线程或多进程环境下的安全性。 常见的原子操作包括原子增加、原子减少、原子交换等。这些操作能够保证在并发执行时不会发生竞争冒险或数据竞争(Data Race),从而确保数据的一致性和完
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之文件描述符
    open返回得到的文件描述符fd可以进行复制,复制成功之后可以得到一个新的文件 描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行IO操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限。 在Linux系统下,可以使用dup或dup2这两个系统调用对文件描述符进行复制。 1.dup 用于并可以多次复制文件描述符,复制得到的文件描述符与原文件描述符都指向同一个文件表,它们的文件偏移量是一
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之多次打开文件
    在一个进程中多次打开同一个文件,会得到多个不同的文件描述符fd,在关闭文件时也需要关闭全部的文件描述符。 测试: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main()
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之竞争冒险
    竞争冒险(Race Condition)指的是在多线程或多进程环境中,多个线程或进程对共享资源进行访问和修改时可能导致的不确定性结果或错误行为。竞争冒险通常发生在多个线程或进程同时访问和修改共享资源的情况下,由于执行时序的不确定性,导致程序的执行结果无法确定。 Linux是一个支持多任务和多用户同时运行的操作系统,它允许多个进程同时执行。在这种环境下,可能会有多个进程同时对同一个文件进行IO操作,
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之Linux系统的文件管理机制
    静态文件与 inode 文件在没有被打开的情况下一般都是存放在存储设备中,比如硬盘、U盘等存储设备。静态文件则是指:存放在磁盘文件系统中,并且以一种固定的形式进行存放的文件。 文件储存在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector),每个扇区储存512字节(相当于 0.5KB),操作系统读取硬盘的时候,不会一个一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之返回错误处理与相关函数
    在程序执行过程中,当判断到某个函数执行失败时,通常会调用return退出程序。在Linux系统下对常见的错误做了一个编号,每一个编号都代表着每一种不同的错误类型,当函数执行发生错误的时候,操作系统会将这个错误所对应的编号赋值给errno变量,每一个进程(程序)都维护了自己的errno变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号,也就意味着下一次的错误码会覆盖上一次的错误码。
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之错误的退出操作
    当程序在执行某个函数时出现错误,如果该错误会导致后续步骤无法正常进行,应该在错误发生时立即终止程序的执行,而不是让程序继续运行下去。 在 Linux 系统下,进程正常退出除了可以使用return之外,还可以使用exit、_exit以及_Exit。 1.3.5.1 exit 该函数是一个标准C库函数,函数会执行一些清理工作,最后调用_exit()函数终止进程。 1.头文件 #include <
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之文件描述符和FILE指针转换
    在同一个文件上执行I/O操作时,系统I/O与标准I/O可以混合使用,借助于库函数 fdopen、fileno可以将文件描述符和FILE指针对象之间进行转换。 1.3.3.1 fileno 用于将传入的FILE指针转换成整数文件描述符。 1)头文件 #include <stdio.h> 2)函数原型 int fileno(FILE *stream); 3)参数 stream:表示需要转换
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之I/O缓冲
    前面有提到系统IO和标准IO在缓冲方面的区别,针对缓冲部分,有一些概念和操作函数需要了解。 1.3.2.1 内核缓冲  实际上系统IO在进行文件读写时并不会直接访问磁盘设备,而是仅仅在用户空间缓冲区和内核缓冲区(kernel buffer cache)之间复制数据,而内核会将其缓冲区中的数据写入(刷新)到磁盘设备中。 系统调用与磁盘操作并不是同步的,例如write函数并不会等待数据真正写入到磁盘之

正在努力加载...