0

我正在测试 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 调用之后显式等待孩子吗?从而获得退出地位?

4

1 回答 1

0

参考您的补充:是

只要父母SIGCHLD因为孩子的死亡而没有处理发送的邮件,孩子就会保持僵尸状态。

如果父母在孩子是僵尸时死亡,孩子会被init(通常是 pid 1)继承,并且在正常情况下init确实会处理 pending SIGCHLD,这反过来会导致孩子正常死亡。

于 2013-04-23T06:12:40.763 回答