退出状态和Linux下的SIGCHLD有什么区别?
子进程终止后,会发送一个SIGCHLD信号来激活父进程(被wait()阻止),那么为什么我们需要子进程的退出状态呢?我找不到SIGCHLD和退出状态之间的链接。
发布于 2017-01-10 05:37:54
子进程的退出状态是它通过exit() (或_exit())系统调用返回给父进程的值。这是一个简单的整数,通常指示子进程的成功或失败,其中零表示成功(按照惯例)。
SIGCHLD是当子进程终止时发送给父进程的信号。它只是通知正在等待的父进程该子进程已经终止。
这两者的组合用于将子进程的执行结果传回其父进程。该信号告诉父进程子进程何时退出,退出状态告诉父进程子进程的执行结果是什么。父级在收到指示该子进程已退出的信号(或从wait()或waitpid()返回)之前,无法检索子进程的退出状态。
子进程可以通过多种方式(各种进程间通信机制、文件I/O等)将其执行结果传回父进程,但最简单的方法是使用exit()和wait()从子进程向父进程发送一个整数状态码。
如果父进程不关心子进程的执行状态,它可以简单地忽略从wait()返回的子进程的退出代码。另一方面,复杂系统可能需要知道退出状态是什么,以便重新启动(fork())子进程的新实例,或者如果子进程没有(或没有)正确地完成其任务,则可能需要执行一些其他程序。
发布于 2017-01-10 05:31:39
退出状态由进程返回(通过调用exit),以告知其父进程是否成功。
当父进程调用wait或waitpid时,它将接收该退出状态(对于waitpid,该子进程的pid),并可以根据该值做出决策。
如果父进程接收到SIGCHLD信号,那么告诉该进程的就是它的一个子进程完成了。它不会向父进程提供有关子进程的pid或退出状态的任何信息。这是一种异步地告诉父级是时候调用wait或waitpid的方法。
https://stackoverflow.com/questions/41557201
复制相似问题