fork()后管道的行为

时间:2010-03-11 21:16:38

标签: c unix fork pipe

在UNIX环境中阅读高级编程中的管道时,我注意到在父叉可以close()管道的读取端之后,它不会关闭子管的读取端。当一个进程分叉时,它的文件描述符会被保留吗?

我的意思是,在fork之前,管道读取文件描述符的保留计数为1,并且在fork 2之后。当父级关闭其读取侧时,fd变为1并且为子级保持打开状态。这基本上是发生了什么?常规文件描述符也会出现这种情况吗?

3 个答案:

答案 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]来自我读/写。