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