4

kill - プロセスをすぐに強制終了しますか?

私は自分の答えを見つけ、シグナルハンドラーを設定し、そのハンドラーSIGCHLDに導入waitしました。そうすれば、親プロセスkillが子プロセスになるたびに、このハンドラーが呼び出され、子を取得するために呼び出さwaitます。- 動機は、プロセス テーブル エントリをクリアすることです。

親プロセスが終了していなくても、いくつかの子プロセスが数秒間進行していることがわかります。- これはどのように可能ですか?

私はこれを介して見ていpsます。親プロセス、子プロセス、および機能していないプロセスを正確ps -o user,pid,ppid,command -axにgrepingします。

4

2 に答える 2

6

子プロセスが機能しなくなる (ゾンビになる) のは、その親プロセス終了しておらず、まだ待機していない場合のみです。元の親が死亡した場合、子の親はプロセス ID 1 になり、そのプロセスの主なタスクは、(継承された) 子が死亡するのを待ち、プロセス リストからそれらを削除して、ゾンビにならないようにすることです。(注意: 孤立した子またはデーモンは、PID 1 によって自動的に継承されます。プロセスの階層を上る祖父母または曽祖父母には割り当てられません。)

子が死亡してから親がwait()(またはwaitpid()、またはwaitid()他のバリアントのいずれか) を介して終了情報を収集するまでの間は、 のように示されるプロセス リスト内のゾンビdefunctですps

しかし、質問のタイトルに答えるには:

  • はい、プロセスは、その親が死ぬことなく機能しなくなる可能性があります。

(そして、その親が死んでいない場合にのみ機能しなくなります。)

于 2011-12-12T22:40:22.470 に答える
6

exitプロセスは、(シグナルから、 への呼び出し、 からの戻りなど) 終了するとすぐに機能しなくなります (ゾンビmain)。wait親がオンにするまでゾンビのままです。

したがって、すべてのプロセスは、終了時に少なくとも一時的にゾンビになります。

親プロセスが (他の作業を行っていたため、またはスケジューラーがまだ CPU 時間を与えていないため) を呼び出す前に少し時間がかかる場合はwait、ゾンビが少し表示されます。親が を呼び出さない場合、wait最終的に終了するときにinit(pid 1) はゾンビ化した子を採用し、それらを呼び出しwaitます。

于 2011-12-12T22:33:35.923 に答える