我已阅读以下声明。
给_exit()的status参数定义了终止状态 该进程,当该进程的父进程可用时 调用wait()。
进程始终由_exit()成功终止(即 _exit() 永远不会回来)。
问题
如果_ 退出未返回,则父进程如何获得终止状态 从子进程到等待?
答案 0 :(得分:3)
当子进程终止时,内核会保留一些有关它的信息。这些信息包括返回代码。
同时,父母尚未终止。通过调用wait
或waitpid
,它只是询问内核“嘿,你知道我的孩子吗?他的状态是什么?”。
答案 1 :(得分:2)
在_exit(int status)函数内部,进程通过SIGCHLD通知父进程它将要终止,并且父级可以使用低8位状态。有三种处理退出状态的方法
答案 2 :(得分:2)
每当进程退出时(无论是否通过调用_exit(int Exit_Status)),内核都会向其父进程发送SIGCHLD函数。父母可以
1. Ignore the incoming signal
2. Catch it by installing a signal handler
具体来说,父级可以通过调用wait()或waitpid()函数来捕获退出状态。在这种情况下,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标志不会产生僵尸,因为内核会重新获得它们。但是,代码不可移植,最好使用等待系统调用。
答案 3 :(得分:1)
_exit()
不返回意味着当进程调用_exit()
时,该调用永远不会从它返回(在这种情况下,因为进程终止)。
_exit()
是一个系统调用,并接受一个参数。内核将该参数保存在内部结构中。对于已经退出但尚未等待(僵尸)的进程,内核具有轻量级结构。当进程通过wait()
(另一个系统调用)等待其子进程时,内核将检索该值,并忘记僵尸。