2016-09-26 11 views
0

3つの子プロセスを作成しました。問題は、私が最後にそれを殺さずにこれらの子供のいずれかを作ることができないということです。それはfork()==0です。 私のコードは次のようである:親プロセスの子プロセスのツリーを削除する方法

for(i=0 ; i<3 ; i++){ 
    if(fork()==0){ 
    //do child things 
    exit(0); 
    } 
    else{ 
    //do parent things 
    } 
} 

私はそれらすべてを殺す、それらが作成されたとき、それらを殺すことなく、これらの3人の子供を作成したい、と思います。

PS:私の英語については申し訳ありません:)

+2

Hm。誰があなたを強制的に殺すのですか? –

+0

あなたの問題は何か分かりません。しかし、子供たちを殺していることを話すことは、どちらの方法でも悪い考えのように聞こえる。 – Olaf

+0

@Olafそれらをゾンビにすることはそれほど良いことではありません:) –

答えて

0

あなたはそれぞれの子のPIDを追跡する必要があります。その後、ループの最後に、あなたはkillです。

pid_t child_pid[3]; 
for(i=0 ; i<3 ; i++){ 
    child_pid[i] == fork(); 
    if (child_pid[i]==-1){ 
     perror("fork failed"); 
     exit(0); 
    } else if (child_pid[i]==0){ 
    //do child things 
    exit(0); 
    } 
    else{ 
    //do parent things 
    } 
} 
for(i=0 ; i<3 ; i++){ 
    kill(child_pid[i], SIGKILL); 
}  
0

問題は、私は最後

私は殺害」と相関することができ、私はあなたのコード例に唯一のもので、それを殺すことなく、これらの子供たちのいずれかを作成することができないということです"子どもたちはexit()への呼び出しです。しかし、私はそれらを「殺す」とはまったく言わないでしょう。各子供は、作業の最後にexit()を実行すると、正常に終了するだけです。

さらに、その時点で子どもを持つ必要はありません。exit()彼らが終了しない場合、彼らはifブロックから単に続行します。自分の子供をフォークしたくない場合は、exit()の代わりにbreakを入れて、周囲のループから脱出することができます。

それはそれを行うことが理にかなっているのかどうかという疑問を抱きます。実際にループを離れると子どもたちが実行するのにふさわしいいくつかの仕事が実際に存在していない限り、彼らが今のようにexit()と呼ぶことは正しいことです。

とにかく、子プロセスを強制終了させるのではなく強制的に終了させたいのであれば、@dbushはどのように行うのかを示しています。しかし、おそらく、子がすべて自分で終了するまで、親のためにがループ後にを待つことを好みます。その場合、kill()を@dbushが示すように呼び出す代わりに、waitpid()を呼び出すことができます。あなたが手作業で子供を殺すと、その後にはでもを待つべきであることにも注意してください。あなたが子供たちを独立して走らせ続けることを望む場合にのみ、あなたがそれらを待たずに済むようにしてください。

関連する問題