2017-01-09 88 views
1

Linux中退出状态和SIGCHLD有什么区别?wait()SIGCHLD和退出状态

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

+0

[父进程如何通过调用\ _exit的子进程的等待来获得终止状态(http://stackoverflow.com/q/6749475)。另请参阅[捕获子进程的退出状态代码](http://stackoverflow.com/q/27306764)和[如果我只是使用wait()等待1个子进程,我是否需要对SIGCHLD处理程序执行任何操作一次完成?](http://stackoverflow.com/q/18437779) – jww

回答

4

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

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

两者的组合用于将子进程的执行结果传回给其父进程。当孩子退出时,信号告诉父母,退出状态告诉父母孩子的执行结果。家长在收到信号(或从wait()waitpid()返回)之前无法检索孩子的退出状态,表明孩子已退出。

孩子可以通过几种方式(各种IPC机制,文件I/O等等)将其执行结果传回给它的父代,但最简单的方法是使用exit()wait()将子状态码家长。

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

+0

非常感谢你先生,现在我明白了信号和退出状态的组合。 – arctic

3

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

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

如果父母收到SIGCHLD信号,则告诉过程的所有信息都是其子过程之一完成。它不会向父母提供有关孩子的pid或退出状态的任何信息。这是一种异步告诉家长的方式,是时候拨打waitwaitpid

+0

谢谢先生,所以信号是给予“去”父母通过等待获得孩子的退出状态。 – arctic