![](/img/trans.png)
[英]is possible to get the exit status from the child of a child process in the parent
[英]How does parent process get the termination status through wait from a child process which calls _exit
我已阅读以下声明。
_exit() 的 status 参数定义了进程的终止状态,当它调用 wait() 时,该进程的父进程可用。
进程总是被_exit() 成功终止(即_exit() 永远不会返回)。
问题
如果_exit不返回,父进程如何通过等待从子进程获取终止状态?
当孩子终止时,kernel 会保留一些关于它的信息。 这些信息中有返回码。
同时,父母还没有终止。 通过调用wait
或waitpid
,它只是询问 kernel “嘿,你认识我的那个孩子吗?他的身份是什么?”。
在 _exit(int status) function 内部,进程通过 SIGCHLD 通知父进程它即将终止,并且状态的低 8 位可供父进程使用。 退出状态的三种处理方式
每当进程退出时(无论是否通过调用 _exit(int Exit_Status) ),kernel 都会向其父进程发送 SIGCHLD function 。 父母可以
1. Ignore the incoming signal
2. Catch it by installing a signal handler
具体来说,父母可以通过调用 wait() 或 waitpid() function 来捕获退出状态。 在这种情况下,LSB 可供父级使用。 具体状态可以如下学习
int status;
wpid = waitpid(child_pid, &status, WUNTRACED);
由于只有最后 8 位可用,因此通过对 255 进行按位和运算来屏蔽高位是合乎逻辑的。系统定义的宏会为您执行此操作
WEXITSTATUS(status);
因此,为了获得子状态 - 您可以在 waitpid 语句之后使用
printf("child exited, status=%d\n", WEXITSTATUS(status));
忽略 SIGCHLD 可能会导致创建僵尸(已失效)进程。 为 SIGCHLD 设置 SA_NOCLDWAIT 标志不会产生僵尸,因为 kernel 会收获它们。 但是,代码不可移植,最好使用等待系统调用。
_exit()
不返回意味着当进程调用_exit()
时,该调用永远不会从它返回(在这种情况下,因为进程终止)。
_exit()
是一个系统调用,并接受一个参数。 kernel 将该参数保存在内部结构中。 kernel 具有轻量级结构,适用于已经退出但尚未等待的进程(僵尸)。 当一个进程通过wait()
(另一个系统调用)等待其子进程时,kernel 检索该值,并忘记了僵尸。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.