如果一端比另一端先关闭,Linux pipe()会发生什么?



通过pipe()系统调用进行进程间通信。子进程写入管道的一端,父进程读取管道的另一端。

父进程在开始读之前,waitpid()等待子进程完成。如果子节点以非零返回值退出,则表明子节点有错误。所以parent只是关闭管道描述符,不读取,继续前进。

你认为这在成功完成孩子的情况下会有效吗?在读取管道之前,家长有效地收获了孩子?如果是,那么传输中的数据会发生什么?操作系统将负责数据安全到达父端?

父进程打开管道。PDT中的两个指针将指向管道。一个给写作,一个给阅读。

每当使用fork创建子进程时,PDT将被复制。因此,子进程在PDT中将有自己的指针指向PIPE。

一开始,管道是空的,如果父进程试图读取,它将阻塞。并且您永远不会创建子进程。这将导致死锁。

如果你在读之前关闭写端,你不会有死锁,但是子进程将不能写到管道(读上面的原因)。

所以这应该是你的流程:

1. Parent process creates pipe
2. fork()
3. in parent process you close the writing end
4. in child process you close the reading end
5. read/write to pipe. 

相关内容

最新更新