UNIX系统支持在不同进程间共享打开的文件。
内核使用三种数据结构表示打开的文件:
1.进程表记录项中的包含有一张打开文件描述符表,每个文件描述符表包括:
a)文件描述符标志(close_on_exec)
文件描述符标志是一个进程所有文件描述符的位图标志,每个比特位代表一个打开的文件描述符,用于确定在调用系统调用execve()时需要关闭的文件句柄。
b)指向一个文件表项的指针
2)内核为每个打开的文件维持一张文件表,每个文件表项包含:
a)文件状态标志(读、写、添写、同步和非阻塞等)
b)当前文件偏移量
c)指向该文件v节点表项的指针
3)每个打开的文件都有一个v节点结构。v节点包含了文件类型和对此文件进行各种操作的函数的指针。对于绝大多数文件,v节点还包含了该文件的i节点。这些信息是在打开文件时从磁盘上读入内存的,所以所有关于文件的信息都是快速可供使用的。例如:i节点包含了文件的所有者、文件长度、文件所在的设备、指向文件实际数据块在磁盘上所在位置的指针等等。
如果两个独立的进程各自打开同一个文件,假设第一个进程在文件描述符3上打开该文件,另一个进程在文件描述符4上打开该文件。打开该文件的每个进程都得到一个文件表项,因为每个进程都有它自己的对该文件的当前偏移量。而对于一个给定的文件,只有一个v节点表项。
dup返回的新文件描述符一定是当前可用的最小文件描述符值
阅读(1679) | 评论(0) | 转发(0) |