我通过pipe()系统调用进行进程间通信。孩子写到一端,父母应该读管道的另一端。
父母在开始阅读之前,waitpid()让孩子完成学业。如果孩子以非零返回值退出 - 那么它表示孩子有错误。因此父级只需关闭管道描述符并继续操作而不进行读取。
你认为这可以在孩子成功完成的情况下发挥作用。父母在阅读烟斗之前是否有效地收割了孩子?如果是,那么传输中的数据会发生什么?操作系统会安全地处理到达父端的数据吗?
答案 0 :(得分:3)
父进程打开一个管道。 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.