我已阅读以下声明。
给予_exit()的状态参数定义了进程的终止状态,当它调用wait()时,这个进程的父进程可以使用它。
一个进程总是被_exit()成功终止(即_exit()永远不会返回 )。
题
如果_ exit没有返回,父进程如何通过等待从subprocess中获得终止状态?
每当进程退出(不管是否通过调用_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标志不会在内核获取僵尸时产生僵尸。 但是,代码是不便携的,它更好地使用等待系统调用。
当孩子终止时,内核保存一些关于它的信息。 这些信息是返回码。
同时,家长还没有终止。 通过呼叫wait
或waitpid
它只是问核心:“嘿,你知道我的孩子?他的状态是什么?”
在_exit(int status)函数中,进程通过SIGCHLD通知父进程即将终止,并且状态的低8位被提供给父进程。 退出状态有三种处理方式
_exit()
不返回意味着当进程调用_exit()
,该调用永远不会从它返回(在这种情况下,因为进程终止)。
_exit()
是一个系统调用,并带有一个参数。 内核将该参数保存在内部结构中。 内核对于已经退出但尚未被等待的进程(僵尸)具有轻量级的结构。 当一个进程通过wait()
(另一个系统调用)等待其子进程时,内核检索该值,并忘记僵尸。