父进程如何通过wait从调用_exit的子进程获得终止状态



我已阅读了以下声明。

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

进程总是通过_exit()(即_exit())成功终止。永远不会返回)。

如果_exit不返回,父进程如何获得终止状态从子进程通过等待?

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

同时,父节点没有终止。通过调用waitwaitpid,它只是问内核"嘿,你知道我的子进程吗?

每当进程退出时(无论是否通过调用_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=%dn", WEXITSTATUS(status));

忽略SIGCHLD可能导致创建僵尸(失效)进程。为SIGCHLD设置SA_NOCLDWAIT标志不会在内核捕获它们时产生僵尸。然而,代码是不可移植的,最好使用wait系统调用。

在_exit(int status)函数中,进程通过SIGCHLD通知父进程它即将终止,并且低阶8位的状态值提供给父进程。有三种处理退出状态的方法

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

_exit()不返回意味着当一个进程调用_exit()时,该调用永远不会从它返回(在这种情况下,因为进程终止)。

_exit()是一个系统调用,接受参数。内核将该参数保存在一个内部结构中。对于已经退出但尚未等待的进程(僵尸),内核有一个轻量级结构。当一个进程通过wait()(另一个系统调用)等待它的子进程时,内核获取该值,并忘记僵尸进程。

最新更新