来自不同进程的两个文件描述符指向打开文件表中的相同条目

时间:2012-07-04 08:06:45

标签: c linux unix file-io linux-kernel

Unix内核使用三种数据结构表示打开的文件: Descriptor table File table v-node table
当进程打开文件两次时,它会在descriptor table中获得两个不同的描述符,file table中的两个条目(因此它们在同一文件中具有不同的位置),并且它们都指向一个条目在v-node table 并且子进程继承父进程的descriptor table,因此内核分别为每个进程维护一个descriptor table。但是来自不同进程的两个描述符指向open file table中的相同条目。
所以

  1. 当子进程对文件进行一些读取时,同一文件的偏移是否会在父进程中发生变化?
  2. 如果1为真,对于两个进程,是否有一种方便的方法可以在同一个文件中获得fork的相同效果?这意味着两个进程共享同一文件的位置(偏移)信息。
  3. 有没有办法进行分叉,以便两个进程都有完全无关的表,比如只有两个不相关的进程才打开相同的文件。

1 个答案:

答案 0 :(得分:8)

  

当子进程对文件进行一些读取时,同一文件的偏移是否会在父进程中发生变化?

是的,因为偏移量存储在系统范围的文件表中。您可以使用dupdup2获得类似的效果。

  

如果1为真,对于两个进程,是否有一种方便的方法可以在同一个文件中获得fork的相同效果?这意味着两个进程共享同一文件的位置(偏移)信息。

使用Unix域套接字有一种称为“传递文件描述符”的技术。在sendmsg中查找“辅助”数据。

  

有没有办法进行分叉,以便两个进程都有完全无关的表,就像两个不相关的进程只打开相同的文件一样。

您必须再次open该文件才能实现此目的。虽然它不能满足你的需求,但你也应该寻找FD_CLOEXEC标志。