父进程如何通过调用_exit的子进程等待来获得终止状态

时间:2011-07-19 15:11:13

标签: c linux multiprocessing ubuntu-10.04

我已阅读以下声明。

  

给_exit()的status参数定义了终止状态   该进程,当该进程的父进程可用时   调用wait()。

     

进程始终由_exit()成功终止(即 _exit()   永远不会回来)。

问题

如果_ 退出未返回,则父进程如何获得终止状态 从子进程到等待

4 个答案:

答案 0 :(得分:3)

当子进程终止时,内核会保留一些有关它的信息。这些信息包括返回代码。

同时,父母尚未终止。通过调用waitwaitpid,它只是询问内核“嘿,你知道我的孩子吗?他的状态是什么?”。

答案 1 :(得分:2)

在_exit(int status)函数内部,进程通过SIGCHLD通知父进程它将要终止,并且父级可以使用低8位状态。有三种处理退出状态的方法

  1. 父进程可能表示它对返回值不感兴趣,在这种情况下,退出状态被丢弃,子进程终止。
  2. 父进程可能处于wait()状态,然后将状态传递给父进程,子进程终止。
  3. 父进程不在wait()中,然后子进程变为僵尸进程,其目的是等待父进程调用wait()来检索退出状态。

答案 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()(另一个系统调用)等待其子进程时,内核将检索该值,并忘记僵尸。