在UNIX环境中阅读高级编程中的管道时,我注意到在父叉可以close()
管道的读取端之后,它不会关闭子管的读取端。当一个进程分叉时,它的文件描述符会被保留吗?
我的意思是,在fork之前,管道读取文件描述符的保留计数为1,并且在fork 2之后。当父级关闭其读取侧时,fd变为1并且为子级保持打开状态。这基本上是发生了什么?常规文件描述符也会出现这种情况吗?
答案 0 :(得分:6)
正如人们可以在手册页上看到fork():
子进程应拥有自己父文件的副本 描述。每个孩子的档案 描述符应指同一个 打开文件描述 相应的文件描述符 父节点。
所以是的,孩子拥有父母文件描述符的精确副本,并引用所有这些文件描述符,包括打开的文件。
答案 1 :(得分:2)
答案是肯定的,是的(同样适用于所有文件描述符,包括套接字等)。
在fork()
调用中,子项获取每个文件描述符的单独副本,每个文件描述符的行为类似于dup()
创建的行为。 close()
仅关闭传递的特定文件描述符 - 例如,如果执行n2 = dup(n); close(n);
,n
所指的文件(管道,套接字,设备...)仍然存在open - 同样适用于fork()
重复的文件描述符。
答案 2 :(得分:1)
是的,fork会复制所有打开的文件描述符。
因此,对于典型的管道,2槽阵列(int fd [2]),fd [0]对于父和子是相同的,因此fd [1]。
你可以创建一个没有分叉的管道,并在一个过程中使用fd [0]和fd [1]来自我读/写。