我正在测试 ptrace 和信号。
问题是,当我使用 sigaction 转发信号,然后将中断信号发送到进程时kill(pid, SIGKILL)
, ptrace(PTRACE_SYSCALL, pid, NULL, tracee_signal)
进程在ps aux
.
只有当我退出“主”进程时,僵尸进程才会通过等待(在“主”进程结束时)收集其返回状态,因此它不再是僵尸。
当我收到信号时,将调用信号处理程序,并将信号的值分配给声明为volatile sig_atomic_t gotsig
(Rockkind) 的全局变量。
因此,在跟踪器的主循环中,我检查该全局变量的值>0
,然后检查 I kill(pid, gotsig);
。
之后有这个ptrace(PTRACE_SYSCALL, pid, NULL, tracee_signal)
。
然后这个过程就变成了僵尸。
为什么会这样?这是正确的行为吗?
补充:
可能是因为我们必须在最近的 ptrace 调用之后显式等待孩子吗?从而获得退出地位?