Unix内核使用三种数据结构表示打开的文件: Descriptor table
, File table
和 v-node table
。
当进程打开文件两次时,它会在descriptor table
中获得两个不同的描述符,file table
中的两个条目(因此它们在同一文件中具有不同的位置),并且它们都指向一个条目在v-node table
并且子进程继承父进程的descriptor table
,因此内核分别为每个进程维护一个descriptor table
。但是来自不同进程的两个描述符指向open file table
中的相同条目。
所以
fork
的相同效果?这意味着两个进程共享同一文件的位置(偏移)信息。答案 0 :(得分:8)
当子进程对文件进行一些读取时,同一文件的偏移是否会在父进程中发生变化?
是的,因为偏移量存储在系统范围的文件表中。您可以使用dup
或dup2
获得类似的效果。
如果1为真,对于两个进程,是否有一种方便的方法可以在同一个文件中获得
fork
的相同效果?这意味着两个进程共享同一文件的位置(偏移)信息。
使用Unix域套接字有一种称为“传递文件描述符”的技术。在sendmsg
中查找“辅助”数据。
有没有办法进行分叉,以便两个进程都有完全无关的表,就像两个不相关的进程只打开相同的文件一样。
您必须再次open
该文件才能实现此目的。虽然它不能满足你的需求,但你也应该寻找FD_CLOEXEC
标志。