Linux 内核文件IO

文件数据结构

Linux内核用三种数据结构来表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。

a)进程表项
每个进程都有一张进程表项,记录着进程打开的文件,这个记录项包含有一个打开文件描述符表。
每一个文件描述符占表中的一项,与每个文件描述符相关联的时:文件描述符标志、一个指向文件表的指针。
备注:
1.单个进程独享
2.某个文件符设置了FD_CLOEXEC标志,该进程调用exec族函数之前放对应的文件描述符

 

b)文件表
内核为所有打开文件维持一张文件表,每个文件表项包括文件状态标志(读、写、同步、非阻塞等)、当前文件偏移量、指向该文件v节点表项的指针
备注:
父子进程共享一个文件表项


c)V节点表
每个打开文件或设备都有一个类型和V节点(v-node)结构。V节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,V节点还包含了该文件的I节点(i-node索引节点)。I节点还包含文件所有者、文件长度、文件所在的设备、 指向文件所在磁盘实际位置的指针。
备注:
所有进程共享文件表

进程与文件间的关系

场景1
单个进程打开两个文件
这里的两个文件可以相同文件文件名,也可以不同的文件名
这里每个文件描述符指向不同的文件表项,即每个文件描述符拥有自己的文件偏移量,不同线程同时写入会导致文件数据相互覆盖,因此多线程写同一文件需要加锁保护

 

场景2
两个进程打开同一个文件
效果和场景1一致

 

 

场景3
父子进程打开两个文件
子进程会拷贝父进程的文件表,但是文件描述符表是父子进程间独立的(即文件描述符可能是不同的)。不同进程同时写入会导致文件数据错乱(不会相互覆盖,因为父子进程共享文件偏移量),需要加锁保护。

 

posted on 2023-02-25 13:31  寒魔影  阅读(121)  评论(0编辑  收藏  举报

导航