unix c编程:不带缓冲的文件 I/O(文件描述符)
2017-12-18 15:37
141 查看
内核使用三种数据结构表示打开的文件,分别是文件描述符表、文件表和 V 节点表。
(1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每个描述符占用一项。与每个文件描述符相关联的是:
(a) 文件描述符标志。
(b) 指向一个文件表项的指针。
(2) 内核为所有打开文件维持一张文件表。每个文件表项包含:
(a) 文件状态标志(读、写、添写、同步和非阻塞等)。
(b) 当前文件偏移量。
(c) 指向该文件 V 节点表项的指针。
(3) 每个打开文件(或设备)都有一个 v 节点(v-node)结构。v 节点包含了文件类型和对此文件进行各种操作的函数的指针。v 节点还包含了从磁盘读取的 i 节点(i-node)的信息,i 节点信息包含了文件的所有者、文件长度、文件所在的设备、指向文件的实际数据块在磁盘上的所在位置的指针等。
图 1 显示了一个进程的三张表之间的关系。该进程有两个不同的打开文件,一个文件打开为标准输入(文件描述符为 0),另一个打开为标准输出(文件描述符为 1)。
图 1: 一个进程打开两个文件的内核数据结构
图 2 给出了两个进程打开同一个文件的内核数据结构。假定第一个进程在文件描述符 3 上打开该文件,而另一个进程在文件描述符 4 上打开该文件。打开该文件的每个进程都得到一个文件表项,但对一个给定的文件只有一个 v 节点表项。
图 2: 两个进程打开同一个文件的内核数据结构
了解这些内核数据结构之后,就能够很容易地理解下面的内容,
• 每个进程都有自己的对打开文件的当前偏移量。
• 在完成每个 write 后,在文件表项中的当前文件偏移量即增加所写的字节数。如果这使当前文件偏移量超过了当前文件长度,则在 i 节点表项中的当前文件长度被设置为当前文件偏移量。
• 若一个文件用 lseek 定位到文件当前的尾端,则文件表项中的当前文件偏移量被设置为 i 节点表项中的当前文件长度。(这与O_APPEND标志打开文件是不同的。使用 lseek 定位到文件尾端处后,下次调用write 写数据不一定是写在改文件的真正尾端,因为 lseek 和 write 两个不是原子操作,中间可以有另一个进程已使文件长度变长了。)
(1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每个描述符占用一项。与每个文件描述符相关联的是:
(a) 文件描述符标志。
(b) 指向一个文件表项的指针。
(2) 内核为所有打开文件维持一张文件表。每个文件表项包含:
(a) 文件状态标志(读、写、添写、同步和非阻塞等)。
(b) 当前文件偏移量。
(c) 指向该文件 V 节点表项的指针。
(3) 每个打开文件(或设备)都有一个 v 节点(v-node)结构。v 节点包含了文件类型和对此文件进行各种操作的函数的指针。v 节点还包含了从磁盘读取的 i 节点(i-node)的信息,i 节点信息包含了文件的所有者、文件长度、文件所在的设备、指向文件的实际数据块在磁盘上的所在位置的指针等。
图 1 显示了一个进程的三张表之间的关系。该进程有两个不同的打开文件,一个文件打开为标准输入(文件描述符为 0),另一个打开为标准输出(文件描述符为 1)。
图 1: 一个进程打开两个文件的内核数据结构
图 2 给出了两个进程打开同一个文件的内核数据结构。假定第一个进程在文件描述符 3 上打开该文件,而另一个进程在文件描述符 4 上打开该文件。打开该文件的每个进程都得到一个文件表项,但对一个给定的文件只有一个 v 节点表项。
图 2: 两个进程打开同一个文件的内核数据结构
了解这些内核数据结构之后,就能够很容易地理解下面的内容,
• 每个进程都有自己的对打开文件的当前偏移量。
• 在完成每个 write 后,在文件表项中的当前文件偏移量即增加所写的字节数。如果这使当前文件偏移量超过了当前文件长度,则在 i 节点表项中的当前文件长度被设置为当前文件偏移量。
• 若一个文件用 lseek 定位到文件当前的尾端,则文件表项中的当前文件偏移量被设置为 i 节点表项中的当前文件长度。(这与O_APPEND标志打开文件是不同的。使用 lseek 定位到文件尾端处后,下次调用write 写数据不一定是写在改文件的真正尾端,因为 lseek 和 write 两个不是原子操作,中间可以有另一个进程已使文件长度变长了。)
相关文章推荐
- UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
- unix c编程:不带缓冲的文件 I/O
- Unix编程:文件I/O操作及文件描述符
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
- Unix高级编程:malloc内存管理、缓冲机制、mmap内存映射到进程、系统调用文件操作
- unix环境高级编程笔记(2)-- 文件I/O之不带缓冲的I/O
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
- Unix高级编程:文件的基本操作、mmap将文件映射虚拟地址、文件描述符的复制
- UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
- UNIX环境高级编程之第6章:系统数据文件和信息-习题
- UNIX环境高级编程 apue.h头文件的配置
- Unix环境高级程序设计入门--文件系统的相关编程(上)
- UNIX环境高级编程-读书笔记-系统文件信息
- <<UNIX环境高级编程>>学习总结——第四章:文件和目录
- UNIX环境编程学习笔记(12)——文件I/O之目录操作
- 高级UNIX编程 的源文件使用
- Unix高级编程:环境变量(续)、管道、文件重定向、信号基础
- UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质
- apue Unix编程之文件IO
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制