系统相关
首页 > 系统相关> > 将SIGKILL发送到Linux中的Zombie Process时会发生什么?

将SIGKILL发送到Linux中的Zombie Process时会发生什么?

作者:互联网

Linux中,当子进程终止并且它的父进程尚未等待它时,它就变成了一个僵尸进程.子的退出代码存储在pid描述符中.

如果向孩子发送SIGKILL,则不应该有任何效果.

这是否意味着退出代码不会被SIGKILL修改,或者是否会修改退出代码以指示子项因为收到SIGKILL而退出?

解决方法:

要回答这个问题,您必须了解如何将信号发送到进程以及进程如何存在于内核中.

每个进程在内核中表示为task_struct(该定义位于sched.h头文件中,并从here开始).该结构包含有关该过程的信息;比如pid.重要信息在line 1566中,其中存储了相关信号.仅当信号发送到进程时才设置此项.

死进程或僵尸进程仍然有task_struct.结构保持不变,直到父进程(自然或采用)在收到SIGCHLD以获得其子进程后调用wait().发送信号时,设置signal_struct.在这种情况下,信号是否是可捕获的无关紧要.

每次进程运行时都会评估信号.或者确切地说,在流程运行之前.然后该过程处于TASK_RUNNING状态.内核运行schedule()例程,该例程根据其调度算法确定下一个正在运行的进程.假设这个过程是下一个运行过程.然后评估signal_struct的值,是否存在待处理的等待信号.如果手动定义信号处理程序(通过signal()sigaction()),则执行注册的功能,否则执行signal’s default action.默认操作取决于发送的信号.

例如,SIGSTOP信号的默认处理程序将当前进程的状态更改为TASK_STOPPED,然后运行schedule()以选择要运行的新进程.请注意,SIGSTOP不可捕获(如SIGKILL),因此无法注册手动信号处理程序.如果发出无法捕获的信号,将始终执行默认操作.

对于你的问题:

调度程序永远不会将失效或死循序确定为再次处于TASK_RUNNING状态.因此,内核永远不会运行相应信号的信号处理程序(默认或定义),无论哪个信号.因此exit_signal将永远不会再次设置.通过在进程的task_struct中设置signal_struct,信号被“删除”到进程,但是不会发生任何其他事情,因为进程将永远不会再次运行.没有代码可以运行,流程的剩余部分就是流程结构.

然后,如果父进程通过wait()收回其子进程,则它接收的退出代码是进程“最初”死亡时的进程代码.是否有信号等待处理并不重要.

标签:linux,process,signals,zombie-process
来源: https://codeday.me/bug/20190809/1631640.html