ptrace とシグナルをテストしています。
問題は、sigaction を使用してシグナルを転送し、割り込みシグナルをプロセスに送信kill(pid, SIGKILL)
した後、 ptrace(PTRACE_SYSCALL, pid, NULL, tracee_signal)
プロセスが の出力でゾンビとして出力されることですps aux
。
「マスター」プロセスを終了した場合にのみ、ゾンビプロセスは待機によって収集されたリターンステータスを持ち(「マスター」プロセスの最後に)、ゾンビでなくなります。
シグナルを受信すると、シグナル ハンドラーが呼び出され、シグナルの値がvolatile sig_atomic_t gotsig
(Rockkind) として宣言されたグローバル変数に割り当てられます。
したがって、トレーサーのメイン ループで、そのグローバル変数の値をチェックしてから、 I をチェックし>0
ますkill(pid, gotsig);
。
その次にあるのがこれptrace(PTRACE_SYSCALL, pid, NULL, tracee_signal)
。
そして、プロセスはゾンビになります。
なぜそれが起こるのですか?それは適切な行動ですか?
追加:
最新の ptrace 呼び出しの後に子を明示的に待機する必要があるためでしょうか? その終了ステータスを取得するには?