0

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 呼び出しの後に子を明示的に待機する必要があるためでしょうか? その終了ステータスを取得するには?

4

1 に答える 1

0

追加の参照: はい

SIGCHLD子供が死亡したために親が送信済みを処理しない限り、子供はゾンビのままです。

子がゾンビである間に親が死亡した場合、子はinit(通常は pid 1) に継承され、通常の状況でinitは pendingSIGCHLDを処理します。これにより、子は適切に死亡します。

于 2013-04-23T06:12:40.763 に答える