2012-03-23 145 views
3

在Unix中,当后台的子进程终止时,它会向父进程发送一个SIGCHLD信号通知它已终止。SIGCHLD信号处理

即使进程处于前台,也会发生同样的情况吗?如果是这样,这意味着家长会忽略它。

这是正确的吗?或者如果它在前景中,那么根本没有信号发送?

+1

是的,我相信SIGCHLD也会发送给前台进程。你可以用strace检查。 – 2012-03-23 20:25:30

+0

你试过了吗? – 2012-03-23 20:33:30

回答

9

背景和前景是作业控制的概念,并且是shell的一部分。它们被应用于进程并且不影响哪个进程产生(exec-ed)另一个进程。

子进程是fork() - exec()调用的结果。孩子获得执行fork()调用过程的父pid。这是SIGCHLD信号的上下文,父pid收到SIGCHLD信号。子进程是“前台”还是“后台”并不重要,在进程退出时只有ppid很重要。

+0

父母何时发送“SIGCHLD”信号?在我编写的代码中,似乎只要它开始执行就会立即发送它,这看起来是错误的。 – darksky 2012-03-23 22:26:56

+0

exectuable将它作为过程概要的一部分 - 在您的过程中关闭打开文件描述符等的部分正在关机。有(取决于实现)文件crt0.o(可能有其他名称),链接到每个可执行映像。它有一些入口点,如_start(),_cleanup()等等,这些入口在main()返回或进程调用_exit()或exit()后调用。 _start()调用main(),BTW。无论如何,这个代码发送信号给父母。 – 2012-03-24 02:51:01

+0

@jimmcnamara:'SIGCHLD'由内核发送。 – ninjalj 2012-03-25 00:06:44

2

有没有这样的事情前景的孩子。术语后台进程用于简单地指我们主要处理父进程(可能创建子进程来完成其工作)。当子进程退出SIGCHLD始终发送给父进程。但是,父进程通常忽略它。如果父母想要处理孩子的退出或者在孩子退出后才做某些动作,则可以使用系统调用wait()来获取子进程的状态。