2016-04-30 13 views
4

kill関数を使用してゾンビプロセスを作成しようとしていますが、単純に子を殺して0を返します。kill関数を使用したゾンビプロセスの作成

int main() 
{ 
    pid_t child_pid; 

    child_pid = fork(); 

    if (child_pid > 0) { 
    kill(getpid(),SIGKILL); 
    } 
    else { 
    exit (0); 
    } 

    return 0; 
} 

私はzがステータス列には存在しないプロセスのステータスを確認します。ここで

+0

これは問題ありません。子プロセスは独自のPIDを持ち、自殺します。 – ForceBru

+0

親プロセスが終了するとゾンビが表示されないことがあります(タイミングが幸運な場合を除きます)。子プロセスは 'init'によって収穫されるからです。 ['wait' man page](http://linux.die.net/man/2/wait)から:"親プロセスが終了すると、 "ゾンビ"の子プロセスがあればそれがinit(8)によって採用されます)、それは自動的にゾンビを削除するための待機を実行します。 – kaylum

答えて

3

はゾンビを作成する必要があります簡単なレシピです:

#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の哲学は、基本的に子供の死が目立つことはないということです。

+0

これはいいですね、ありがとう^ -^@Steve Summit – robo

関連する問題