我正在测试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电话后明确地等待孩子吗?为了获得退出状态?
答案 0 :(得分:0)
参考你的补充:是的
只要父母没有处理由于孩子死亡而发送的SIGCHLD
,孩子就会留下僵尸。
如果父亲在孩子是僵尸时死亡,则孩子会被init
(通常是pid 1
)继承,并且在正常情况下init
确实会暂停{{1}这反过来导致孩子正常死亡。