C 管道在fork()之后的行为

C 管道在fork()之后的行为,c,unix,fork,pipe,C,Unix,Fork,Pipe,在UNIX环境中阅读高级编程中的管道时,我注意到在分叉之后,父级可以close()管道的读取端,而不会关闭子级的读取端。当一个进程分叉时,它的文件描述符会被保留吗 我的意思是,在fork之前,管道读取文件描述符的retain计数为1,在fork之后为2。当父级关闭其读取端时,fd变为1,并为子级保持打开状态。这就是正在发生的事情吗?常规文件描述符也会发生这种行为吗?可以在手册页上看到: 子进程应有其自己的父进程文件副本 描述符。每个孩子的档案 描述符应指相同的名称 使用打开文件描述 系统的相应文

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


我的意思是,在fork之前,管道读取文件描述符的retain计数为1,在fork之后为2。当父级关闭其读取端时,fd变为1,并为子级保持打开状态。这就是正在发生的事情吗?常规文件描述符也会发生这种行为吗?

可以在手册页上看到:

子进程应有其自己的父进程文件副本 描述符。每个孩子的档案 描述符应指相同的名称 使用打开文件描述 系统的相应文件描述符 家长


因此,是的,子对象具有父对象的文件描述符的精确副本,该副本引用了所有父对象的文件描述符,包括打开的文件。

是的,fork复制了所有打开的文件描述符

因此,对于一个典型的管道,一个2槽数组(int fd[2]),fd[0]对于父级和子级是相同的,fd[1]也是相同的


您可以创建一个完全不分叉的管道,并通过在一个过程中使用fd[0]和fd[1]对自己进行读/写。

答案是肯定的,是的(这同样适用于所有文件描述符,包括套接字等)


fork()
调用中,子对象将获得每个文件描述符的单独副本,每个文件描述符的行为都类似于由
dup()
创建的。
close()
仅关闭传递的特定文件描述符-例如,如果执行
n2=dup(n);关闭(n)
n
所指的文件(管道、插座、设备…)保持打开状态-这同样适用于由
fork()

复制的文件描述符…除非你做了一些欺骗(你不应该做的,那不是它确实存在的),但你发布的不是
fork()
,而是它的变体。不,我的意思是
pthread\u atfork
可以在
fork
时间将程序的操作更改为(例如)包括关闭文件描述符。但是默认情况下这不会发生,不管怎样滥用这个接口都是一件奇怪的事情。谁来读?二者都第一个叫雷德?如果它们当前都在读取时被阻止了呢?这正是我想要的。非常感谢你。