发送ptrace信号后获取僵尸进程

时间:2013-04-22 18:20:50

标签: c linux signals ptrace zombie-process

我正在测试ptrace和信号。

问题在于,当我使用sigaction转发信号,然后通过kill(pid, SIGKILL)将中断信号发送到进程时,ptrace(PTRACE_SYSCALL, pid, NULL, tracee_signal)进程在{ps aux的输出处打印为zombie 1}}。

只有当我退出“主”进程时,僵尸进程才会通过等待收集其返回状态(在“主”进程结束时),因此它不再是僵尸。

当我收到信号时,调用信号处理程序,并将信号的值分配给声明为volatile sig_atomic_t gotsig的全局变量(Rockkind)。

因此,在跟踪器的主循环中,我检查全局变量为>0,然后是kill(pid, gotsig);

之后有ptrace(PTRACE_SYSCALL, pid, NULL, tracee_signal)

然后这个过程就变成了僵尸。

为什么会这样?这是正确的行为吗?

增加:
可能是因为我们必须在最近的ptrace电话后明确地等待孩子吗?为了获得退出状态?

1 个答案:

答案 0 :(得分:0)

参考你的补充:是的

只要父母没有处理由于孩子死亡而发送的SIGCHLD,孩子就会留下僵尸。

如果父亲在孩子是僵尸时死亡,则孩子会被init(通常是pid 1)继承,并且在正常情况下init确实会暂停{{1}这反过来导致孩子正常死亡。