【问题标题】:wait() SIGCHLD and the exit statuswait() SIGCHLD 和退出状态
【发布时间】:2017-01-09 21:24:21
【问题描述】:

Linux 中的退出状态和SIGCHLD 有什么区别?

子进程终止后,发送SIGCHLD 信号激活父进程(被wait() 阻止),那么为什么我们需要子进程的退出状态呢?我找不到SIGCHLD 和退出状态之间的链接。

【问题讨论】:

标签: c linux unix operating-system


【解决方案1】:

子进程的退出状态是它通过exit()(或_exit())系统调用返回给父进程的值。这是一个简单的整数,通常表示子进程的成功或失败,其中零表示成功(按照惯例)。

SIGCHLD 是子进程终止时发送给父进程的信号。它只是通知等待的父母孩子已经终止。

两者的组合用于将子进程的执行结果传回其父进程。当子进程退出时,信号告诉父进程,退出状态告诉父进程子进程的执行结果是什么。父级在收到一个信号(或来自wait()waitpid() 的返回)表明子级已退出之前,无法检索子级的退出状态。

子进程可以通过多种方式(各种 IPC 机制、文件 I/O 等)将其执行结果传回父进程,但最简单的方法是使用 exit()wait() 发送整数状态码从孩子到父母。

如果父进程不关心子进程的执行状态是什么,它可以简单地忽略从wait()返回的子进程的退出代码。另一方面,复杂系统可能需要知道退出状态是什么以便重新启动(fork())子进程的新实例,或者如果子进程执行(或没有执行)可能执行其他程序) 正确完成任务。

【讨论】:

  • 非常感谢先生,现在我明白信号和退出状态的组合了。
【解决方案2】:

退出状态由进程返回(通过调用exit)告诉其父进程是否成功。

当父进程调用waitwaitpid 时,它会收到退出状态(在waitpid 的情况下,子进程的pid)并可以根据该值做出决定。

如果父进程收到一个SIGCHLD 信号,那么所有告诉进程的是它的一个子进程已完成。它不会向父母提供有关孩子的 pid 或退出状态的任何信息。这是一种异步告诉父级是时候调用waitwaitpid 的方法。

【讨论】:

  • 谢谢先生,所以信号是给父母“去”让父母通过等待获得孩子的退出状态。
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2013-03-18
相关资源
最近更新 更多