wait()SIGCHLD和退出状态

时间:2017-01-09 21:24:22

标签: c linux unix operating-system

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:4)

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

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

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