c - 系统编程 : wait(&status)'s return value

标签 c linux systems-programming waitpid

在学习 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 是否被“停止”[由 stracegdb 和其他调试器使用]。如果您查看 wait(2) 联机帮助页,就会发现一大堆“辅助”宏,例如 WIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIG 等有助于理解 status

对于返回值,-1表示错误。但是,错误 [在全局 errno 中] 可以是 ECHILD。这仅意味着父进程不再有子进程。 (即)该程序等待并“收获”了之前通过 fork 启动的所有子级。

关于c - 系统编程 : wait(&status)'s return value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34869442/

相关文章:

c - 这个数据报套接字有什么问题?

c - C语言的字数统计程序没有输出

c - OpenSSL RSA 签名验证 : hash and padding?

python - 在 python/bash/perl 脚本中执行和读取二进制文件的输出

linux - 关于linux内核模块

reverse-engineering - PDB 文件中不存在导出的别名符号(RegisterClipboardFormat 具有 RegisterWindowMessage 内部名称)

c - 选择仅有效一次

c - 制作一个随机节点,第一个节点

linux - 提取多个特定字段及其下一个字段

c - exec 系列函数的工作