![](/img/trans.png)
[英]The parent-process only received SIGCHLD from its children once or twice, no mater how many times it fork()
[英]Kernel re-try sending SIGCHLD again if parent process fails once to collect termination status
当父进程无法收集系统(内核)通过SIGCHLD
发送的子进程的终止状态时,该子进程将成为Zombie进程。
系统是否再次尝试为父进程发送该进程终止状态,以尝试收集其子进程的退出状态?
这样的事情会发生吗,僵尸进程将从进程表中删除?
父母会再次尝试读取其孩子的终止状态吗?
当父进程无法收集系统(内核)通过SIGCHLD发送的子进程的终止状态时,该子进程将成为Zombie进程。
这在技术上不准确。 僵尸进程不是其父级无法获取终止状态的进程,而是已经终止但未获得终止状态的进程。
因此,到在父级中传递SIGCHLD
,该进程已经是僵尸,因为它已终止,但未获得终止状态。
关键是, SIGCHLD
在这里是无关紧要的:父母要么获得孩子的终止身份,要么没有,在这种情况下孩子仍然是僵尸。
系统是否再次尝试为父进程发送该进程终止状态,以尝试收集其子进程的退出状态?
不会SIGCHLD
只交付一次。 如果父级没有在信号处理程序中获得僵尸的终止状态(这不是必需的),则它要么稍后执行(在程序代码中的某个时候),要么终止而不执行(在这种情况下,僵尸的父母成为初始化进程;初始化会定期获得孤儿的地位,以清理僵尸。
这样的事情会发生吗,僵尸进程将从进程表中删除?
父进程获得退出状态后,僵尸进程使用的资源就会被释放。
OTOH,如果SIGCHLD
被显式忽略(即,通过将其处置方式更改为SIG_IGN
),则不会有僵尸进程,因为忽略SIGCHLD
阻止这种情况。 但是,将无法获得终止状态。
从第man 2 sigaction
:
POSIX.1-1990不允许将SIGCHLD的操作设置为SIG_IGN。
POSIX.1-2001允许这种可能性,因此可以忽略SIGCHLD来防止创建僵尸(请参阅wait(2))。
最后:
父母会再次尝试读取其孩子的终止状态吗?
通常,一旦父母收集了僵尸的退出状态,再次尝试执行此操作将导致错误。 如前所述,获取僵尸的终止状态将释放该僵尸正在使用的所有资源,因此您不能多次获取终止状态。
该规则的例外是将WNOWAIT
标志传递给waitid(2)
。 该标志收集子进程的终止状态,并将其置于等待状态。 以后的呼叫可以在同一过程中再次使用以获取终止状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.