2016-11-17 8 views
0

ゾンビのプロセスを避けるには?この状況でinitプロセスが正確に何をするのでしょうか?
私はこのプログラムを見て、それを取得することができていませんでした: はどのようにこのプログラムは、ゾンビプロセスを作成しない:それは、出口をしたときゾンビのプロセスを避けるには?この状況でinitプロセスが正確に何をするのでしょうか?

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(void) 
{ 
    pid_t p = fork(); 

    if (p != 0) 
    { 
     waitpid(p, NULL, 0); /* See if the child already had ended. */ 
     sleep(1); /* Wait 1 seconds for the child to end. And eat away the SIGCHLD in case if arrived. */ 
     pause(); /* Suspend main task. */ 
    } 
    else 
    { 
     sleep(3); /* Just let the child live for some tme before becoming a zombie. */ 
    } 

    return 0; 
} 
+0

ここでは正確に何を理解しようとしていますか?あなたのコードにはどんな問題がありますか? –

+0

コードは大丈夫です。一部のリファレンスから取得したコードです。ちょうどその説明をしたい..それはどのようにゾンビのプロセスを作成します。 – pankaj

+0

Initはこの状況で何もしません。プロセスが生成された子プロセスの戻り状態を待つ前にプロセスが終了すると、initプロセスが終了するまで、作成されたプロセスは終了後「ゾンビプロセス」になります。 あなたの場合、親プロセスは待機します。だから、initは何もしない。 –

答えて

0

子プロセスはゾンビプロセスになりますが、親プロセスがやりましたまだwaitpidwaitまたはwaitidを実行していません。通常の状況では、親は子プロセスの終了ステータスを知りたいので、waitpidforkから得たpidに実行します。

  • 子供が生み出されて終了されますが、Ctrl + Cキーを押すまで(else節とリターンを残し0)
  • 親が(無限pauseループに動作します:上記のコードの中で何が起こる

    :睡眠とwaitpidのは、あなたがプログラムを起動し、実行している、それを残す(./a.out &)、その後ps -fxを実行した場合、あなたはこのような何かを参照してください)

余分にあります

6940 pts/1 SN  0:00  ./a.out 
6943 pts/1 ZN  0:00  \_ [a.out] <defunct> 

ここで、親プロセス(kill 6940)を終了すると、その子プロセスは孤児になり、initプロセスは自動的に新しい親プロセスになります。 initプロセスはすべてのプロセスでwaitpidが実行されるため、ゾンビプロセスを継承し、最終的にプロセステーブルから削除され、それ以上表示されません。ps -f

関連する問題