谁等待shell后台进程?

时间:2015-06-01 18:21:14

标签: linux bash shell process wait

我想知道这个问题:

如果我在bash中输入以下命令

#sleep 100&

shell怎么知道等待它结束?

当shell为了执行sleep命令而自行分配时,&符号技术上是否意味着它不会等待新分叉的进程? 尽管如此,它仍然在等待它(否则我会把它看作是一个僵尸,我不这样做)

在这里感到困惑:\

1 个答案:

答案 0 :(得分:2)

当子进程退出时,shell会获得SIGCHLD;因此,它可以立即调用信号处理程序中的wait4()来获取它。

如果您运行strace bash,您会看到以下内容:

--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=13708, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG, NULL) = 13708
wait4(-1, 0x7fffbca63110, WNOHANG, NULL) = -1 ECHILD (No child processes)

也就是说:shell获得一个子进程退出的信号;它在没有PID的情况下调用wait4(),从而从其进程表中收获第一个死孩子;并再次打电话给我们,并告知他们不会留下任何死去的孩子。

这与在前台运行进程的情况不同,后台立即运行阻止 wait()