Linux打开文件的内核数据结构

Linux打开文件的内核数据结构

上图表现了进程打开的标准输入与标准输出文件的内核数据结构(可用于所有I/O)。

值得注意的是:在Linux中没有使用v-node节点,而是直接使用了通用的i-node节点结构。

 

这三张表(进程文件描述符表,打开文件表,i-node节点表)的关系及其表项内容也在上图中表现出来了。

需要注意一点:这种表间关系对于在不同进程之间共享文件的方式非常重要。

如下图:两个独立进程各自打开同一个文件

Linux打开文件的内核数据结构

注意打开文件表的表项中有一个文件状态标志和当前文件偏移量,各个进程对同一个文件可以持有不同的文件状态(如第一个进程指明非阻塞,而第二个进程默认阻塞)。另外,每个进程都有其自己的当前文件偏移量。

这也是为什么每个进程都获得自己的文件表项的原因。

另外,一个进程中多个文件描述符可能指向同一个文件表项,比如使用dup/dup2系统调用所得到的新文件描述符。如下图:

Linux打开文件的内核数据结构

 

在fork()后也发生同样的情况,此时父子进程各自的每一个打开文件描述符共享同一个文件表项。