在学习分叉和管道时,我遇到了以下优秀教程: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循环退出。这很不耐烦:有错误,为什么?我们如何确保父母一直在旋转,直到所有孩子都正常终止?什么是'状态'无论如何,它是如何设定的?
编辑:要添加,程序会编译并运行完美。
答案 0 :(得分:5)
当您致电wait(&status)
时,&
说"取#34}的地址status
。
因此,您将指针传递给status
,而不传递值。
wait
例程将使用此指针在返回之前使用值填充status
。除了函数的返回值之外,这是。
因此,{<1}}在通话后有效。
在电话会议之前,您不需要将status
设置为任何的原因是status
仅设置值并且不尝试预先使用该值。
wait
包含一些内容。子程序是否正常退出(例如退出代码0,或者错误代码为[例如] 1)。程序是否被信号终止(例如status
)。孩子是否已经停止了#34; [由SIGSEGV
,strace
和其他调试程序使用]。如果你看一下gdb
联机帮助页,就会有很多&#34;帮助&#34;宏,例如wait(2)
,WIFEXITED
,WEXITSTATUS
,WIFSIGNALED
等,可以帮助理解WTERMSIG
值
关于返回值,status
表示错误。但是,[全局-1
]中的错误可能是errno
。这意味着不再有父进程的子进程。 (即)该计划已经等待并且已经收获了#34;以前通过ECHILD
启动的所有孩子。