在学习 fork 和管道时,我遇到了以下优秀教程: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(): on success, returns the process ID of the terminated child; on error, -1 is returned.
所以在上面的代码行中,当wait(&status)
返回-1时while循环退出。这很刺耳:有没有错误,为什么?我们如何确保父级一直旋转直到其所有子级正确终止?到底什么是“状态”,它是如何设置的?
编辑:要补充一点,该程序确实可以完美地编译和运行。
最佳答案
当您调用 wait(&status)
时,&
表示“获取”status
的地址。
因此,您将指针传递给status
,不是它的值。
wait
例程将使用此指针在返回前用一个值填充status
。这是 函数返回值的补充。
因此,status
将在调用后 有效。
您不需要在调用之前将status
设置为任何值的原因是wait
仅设置 一个值,并且不尝试预先使用该值。
status
包含一些内容。子程序是否正常退出(例如退出代码 0,或错误代码为 [say] 1)。程序是否被信号终止(例如 SIGSEGV
)。 child 是否被“停止”[由 strace
、gdb
和其他调试器使用]。如果您查看 wait(2)
联机帮助页,就会发现一大堆“辅助”宏,例如 WIFEXITED
、WEXITSTATUS
、 WIFSIGNALED
、WTERMSIG
等有助于理解 status
值
对于返回值,-1
表示错误。但是,错误 [在全局 errno
中] 可以是 ECHILD
。这仅意味着父进程不再有子进程。 (即)该程序等待并“收获”了之前通过 fork
启动的所有子级。
关于c - 系统编程 : wait(&status)'s return value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34869442/