はゾンビを作成する必要があります簡単なレシピです:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main()
{
int pid = fork();
if(pid == 0) {
/* child */
while(1) pause();
} else {
/* parent */
sleep(1);
kill(pid, SIGKILL);
printf("pid %d should be a zombie\n", pid);
while(1) pause();
}
}
キーが親ということである - つまり、このプログラムは - 動作を続けますがが死んで子供にwait()
を行いません。
ゾンビは、待たれていない死んだ子供です。このプログラムが死んだ子供を待っていたら、それは遠ざかり、ゾンビではないでしょう。このプログラムが終了した場合、ゾンビの子供は他の誰か(おそらくinit
)に継承され、おそらく待機を行い、子供は離れてゾンビにならないでしょう。
私が知る限り、ゾンビの全理由は、死んだ子供が誰かが望むかもしれない終了ステータスで出てきたことです。しかし、Unixが保存しているところでは、終了状態は死んでいるプロセスの空の殻の中にあり、死んだ子供の終了状態を取得する方法は、それを待つことです。だから、Unixはちょうどその親がそれを望んでいるが、まだwait
を呼び出すことを逃していない場合のために、その終了ステータスを維持するためにゾンビを保持している。
これは実際には詩的なものです。ここでのUnixの哲学は、基本的に子供の死が目立つことはないということです。
これは問題ありません。子プロセスは独自のPIDを持ち、自殺します。 – ForceBru
親プロセスが終了するとゾンビが表示されないことがあります(タイミングが幸運な場合を除きます)。子プロセスは 'init'によって収穫されるからです。 ['wait' man page](http://linux.die.net/man/2/wait)から:"親プロセスが終了すると、 "ゾンビ"の子プロセスがあればそれがinit(8)によって採用されます)、それは自動的にゾンビを削除するための待機を実行します。 – kaylum