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

我已阅读以下声明。

给予_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标志不会在内核获取僵尸时产生僵尸。 但是,代码是不便携的,它更好地使用等待系统调用。

当孩子终止时,内核保存一些关于它的信息。 这些信息是返回码。

同时,家长还没有终止。 通过呼叫waitwaitpid它只是问核心:“嘿,你知道我的孩子?他的状态是什么?”

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

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

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

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