繁体   English   中英

如果父进程一次无法收集终止状态,则内核重试再次发送SIGCHLD

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM