上图表现了进程打开的标准输入与标准输出文件的内核数据结构(可用于所有I/O)。
值得注意的是:在Linux中没有使用v-node节点,而是直接使用了通用的i-node节点结构。
i-node节点包含了文件的类型、长度、所有者、访问权限以及指向文件实际数据在磁盘块上所在位置的指针等等。
stat结构中的大多数信息都取自i-node,只有两项重要数据存放在目录项中:文件名和i-node编号
如下图说明
首图中三张表(进程文件描述符表,打开文件表,i-node节点表)的关系及其表项内容也在图中表现出来了。
需要注意一点:这种表间关系对于在不同进程之间共享文件的方式非常重要。
如下图:两个独立进程各自打开同一个文件
注意打开文件表的表项中有一个文件状态标志和当前文件偏移量,各个进程对同一个文件可以持有不同的文件状态(如第一个进程指明非阻塞,而第二个进程默认阻塞)。另外,每个进程都有其自己的当前文件偏移量。
这也是为什么每个进程都获得自己的文件表项的原因。
另外,一个进程中多个文件描述符可能指向同一个文件表项,比如使用dup/dup2系统调用所得到的新文件描述符。如下图:
在fork()后也发生同样的情况,此时父子进程各自的每一个打开文件描述符共享同一个文件表项。