我想知道这个问题:
如果我在bash中输入以下命令
#sleep 100&
shell怎么知道等待它结束?
当shell为了执行sleep命令而自行分配时,&符号技术上是否意味着它不会等待新分叉的进程? 尽管如此,它仍然在等待它(否则我会把它看作是一个僵尸,我不这样做)
在这里感到困惑:\
答案 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()
。