在LINUX/UNIX系统下,有着 一切皆文件的定义,所谓文件IO就是指文件的 输入和 输出。
系统调用IO
系统调用文件IO有open、oepnat、creat、close、lseek、read、write,这里不对调用函数做过多的详解。
IO效率
IO的效率主要讲的是IO缓冲区的大小和CPU执行效率之间的关系,缓冲区BUFFER越小,调用系统函数read()和write()次数约多,从而CPU的消耗就越大,如果要对文件进行频繁的修改在内存中操作无疑是效率最高的选择,所以输入和输出都会先写进缓存,当缓存区满了之后在执行刷新把数据写入磁盘,系统调用函数sync函数、fsync函数和fdatasync函数可以直接刷新缓冲区把文件写入本地。
设备与文件IO
较新的系统都提供名为/dev/fd 的目录,其目录项是命名为0、1、2…n等的文件,打开文件/dev/fd/n等效于复制描述符n。
文件IO的数据结构
在这会对文件IO的数据结构进行详细讲解,我们通过文件描述符(FD) 找到对应的文件表,从文件表中找到v节点和i节点表,在通过i节点中的磁盘地址访问对应磁盘的储存。
下图是由两个文件描述符指向同一个文件的结构模型,在调用int dup(int fd)和int dup2(fd1,fd2)函数后会形成如下图结构,在这只看单文件的表示。
进程表
在打开一个文件后,内核给进程返回一个文件描述符(FD),这个文件描述符记录在进程表中,进程表中存放文件描述符(FD) 和一个指向文件表的指针。
- 文件描述符(FD)
对于内核而言,所有打开的文件都通过文件描述符引用,所有打开或新创建的文件,操作系统内核都会向进程返回一个文件描述符(FD),这个文件描述符里0与进程的标准输入关联,1与标准输出关联,2与标准错误关联。
文件表
文件表中有文件状态标志(close_on_exec) 、当前文件的偏移量、v节点指针,其中v节点指针指向v节点表。
- 文件状态标志(close_on_exec)
文件描述符标志(close_on_exec)是一个标志位,当使用execl开启一个进程后,打开的进程需要用到主进程中打开的文件描述符就会用到该标志,文件状态标志(close_on_exec) 的主要作用是执行exec函数时,判断是否要关闭子进程对主进程文件描述符的访问权限,如果关闭了此权限,打开的进程无法访问主进程中打开的文件描述符,否则可以使用此文件描述符对文件进行读写。
测试程序 test.c
#include<apue.h>
#include<fcntl.h>