系统编程:等待(& status)的返回值

时间:2016-01-19 05:55:36

标签: c linux systems-programming waitpid

在学习分叉和管道时,我遇到了以下优秀教程: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循环退出。这很不耐烦:有错误,为什么?我们如何确保父母一直在旋转,直到所有孩子都正常终止?什么是'状态'无论如何,它是如何设定的?

编辑:要添加,程序会编译并运行完美。

1 个答案:

答案 0 :(得分:5)

当您致电wait(&status)时,&说"取#34}的地址status

因此,您将指针传递给status,而传递

wait例程将使用此指针在返回之前使用值填充status。除了函数的返回值之外,这是

因此,{<1}}在通话后有效

电话会议之前,您不需要将status设置为任何的原因是status设置值并且尝试预先使用该值。

wait包含一些内容。子程序是否正常退出(例如退出代码0,或者错误代码为[例如] 1)。程序是否被信号终止(例如status)。孩子是否已经停止了#34; [由SIGSEGVstrace和其他调试程序使用]。如果你看一下gdb联机帮助页,就会有很多&#34;帮助&#34;宏,例如wait(2)WIFEXITEDWEXITSTATUSWIFSIGNALED等,可以帮助理解WTERMSIG

关于返回值,status表示错误。但是,[全局-1]中的错误可能是errno。这意味着不再有父进程的子进程。 (即)该计划已经等待并且已经收获了#34;以前通过ECHILD启动的所有孩子。