【发布时间】:2016-01-19 05:55:36
【问题描述】:
在学习分叉和管道时,我偶然发现了以下优秀教程:https://www.cs.rutgers.edu/~pxk/416/notes/c-tutorials/pipe.html
但是,本教程将讨论如何在由最后一个父进程生成的 2 个子进程之间建立管道。虽然它在这方面做得很好,但某行代码让我困惑了一段时间:
while ((pid = wait(&status)) != -1) /* pick up all the dead children*/
fprintf(stderr, "process %d exits with %d\n", pid, WEXITSTATUS(status));
exit(0);
我真的对wait(&status) 感到困惑(是的,我已经阅读了http://linux.die.net/man/2/wait 的手册页)。我们只是声明了一个int status,从来没有真正给它一个值,只是将它传递给等待。此状态是否在 wait() 函数中透明设置?
手册页说:
wait():成功时,返回终止子进程的进程ID;出错时返回-1。
所以在上面的代码行中,当wait(&status) 返回-1 时,while 循环退出。这很令人震惊:是否有错误,为什么?我们如何确保父母一直在旋转,直到所有孩子都正确终止?什么是“状态”,它是如何设置的?
编辑:补充一点,程序确实可以完美编译和运行。
【问题讨论】:
-
wait()的“官方”手册页供您参考:man7.org/linux/man-pages/man2/wait.2.html
标签: c linux systems-programming waitpid