操作"/>
无缓冲文件IO和目录操作
Python微信订餐小程序课程视频
Python实战量化交易理财系统
引言
在后台开发中,对于文件I/O我们通常不使用C语言封装的fopen、fread、fwrite标准I/O,而是直接使用Linux提供的系统调用函数。因为这些系统调用没有使用用户缓冲区,我们直接与内核打交道,效率更高,且可以自己定制一些符合应用场景的操作。下面介绍Linux用于文件I/O的数据结构,以及一些具体的系统调用函数。
文件描述符
所有打开的文件都通过文件描述符引用,文件描述符只在当前进程有效,因为每个进程有一个PCB结构体,PCB包含一个文件描述符表。
文件描述符0对应标准输入、1对应标准输出、2对应标准错误,这些是在进程创建时默认绑定的文件描述符。
以上分别对应unistd.h中的STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。
每个进程的最大文件描述符可通过ulimit -a
命令查看,并可通过ulimit -n 数字
设置。
无缓冲文件IO
我们这里所说的无缓冲IO指的是无用户缓冲区,如fopen、fwirte、fread等函数,进程会在用户进程空间维护缓冲区,然后内核还有缓冲区,最后才是磁盘。而无缓冲IO是指只有内核缓冲区而无用户缓冲区,并不是没有任何缓冲区。
内核用于文件I/O的数据结构
每个进程在进程表中都有一个记录项,记录项包含一张打开文件描述符表。
在打开文件描述符表中,每个描述符占用一项:
- 文件描述符标志:目前只有CLOEXEC。
- 指向文件表项的指针
内核为所有打开文件维持一张文件表,每个文件表项包括:
- 文件状态标志:包括文件类型和访问权限。
- 当前文件偏移量
- 指向该文件inode节点的指针
他们之间的关系如下:
不同的文件表项可以指向相同的文件(i节点即索引结点),这可以使不同的进程有它自己的对该文件的偏移量和打开访问权限。
不同的文件描述符可以指向相同的文件表项。如在fork后,父子进程的
更多推荐
无缓冲文件IO和目录操作
发布评论