9

Unix 内核使用三种数据结构表示打开的文件:Descriptor tableFile tablev-node table.
当一个进程打开一个文件两次时,它会在 . 中获得两个不同的描述符descriptor tablefile tablev-node table.
而子进程继承父进程的descriptor table,所以内核descriptor table为每个进程分别维护一个。但是来自不同进程的两个描述符指向open file table.
所以

  1. 当子进程对文件进行一些读取时,同一个文件的偏移量在父进程中会改变吗?
  2. 如果 1 为真,对于两个进程,是否有一种方便的方法可以在同fork一个文件上获得相同的效果?这意味着两个进程在同一个文件上共享一个位置(偏移)信息。
  3. 有没有办法让两个进程都有完全不相关的表,就像两个不相关的进程只是他们打开了相同的文件。
4

1 回答 1

11

当子进程对文件进行一些读取时,同一个文件的偏移量在父进程中会改变吗?

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

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

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

有没有办法让两个进程都有完全不相关的表,就像两个不相关的进程只是他们打开了相同的文件。

您必须open再次访问该文件才能实现此目的。虽然它没有做你想做的事,但你也应该寻找FD_CLOEXEC标志。

于 2012-07-04T08:14:13.030 回答