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

WiS*_*GaN 7 c unix linux 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. 有没有办法分叉,以便两个进程都有完全不相关的表,比如只有两个不相关的进程才能打开相同的文件.

cni*_*tar 9

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

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

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

使用Unix域套接字有一种称为"传递文件描述符"的技术.寻找"辅助"数据sendmsg.

有没有办法分叉,以便两个进程都有完全不相关的表,比如只有两个不相关的进程才能打开相同的文件.

您必须open再次使用该文件才能实现此目的.虽然它没有做你想要的,你也应该寻找FD_CLOEXEC旗帜.