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