繁体   English   中英

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

[英]How does parent process get the termination status through wait from a child process which calls _exit

我已阅读以下声明。

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

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

问题

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

当孩子终止时,kernel 会保留一些关于它的信息。 这些信息中有返回码。

同时,父母还没有终止。 通过调用waitwaitpid ,它只是询问 kernel “嘿,你认识我的那个孩子吗?他的身份是什么?”。

在 _exit(int status) function 内部,进程通过 SIGCHLD 通知父进程它即将终止,并且状态的低 8 位可供父进程使用。 退出状态的三种处理方式

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

每当进程退出时(无论是否通过调用 _exit(int Exit_Status) ),kernel 都会向其父进程发送 SIGCHLD function 。 父母可以

     1. Ignore the incoming signal
     2. Catch it by installing a signal handler

具体来说,父母可以通过调用 wait() 或 waitpid() function 来捕获退出状态。 在这种情况下,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 标志不会产生僵尸,因为 kernel 会收获它们。 但是,代码不可移植,最好使用等待系统调用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM