2013-12-15 7 views
5

、私は疑問に思って:このCコードはゾンビプロセスを作成できますか?次のコードは、ゾンビを作成することができるかどう

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

int main(){ 
    int i=1; 
    pid_t p; 
    p = fork(); 
    i++; 
    if(p!=0){ 
     waitpid(p, NULL, 0); 
    } 
    printf("%d\n",i); 
    return 0; 
} 

ので、親プロセスは、子が既に終了していない場合はすぐに戻り、子プロセスのためのwaitpidを呼び出します。したがって、これまでにゾンビは発生しません。しかし、子供が

return 0;
コマンドの前に出るなら、これはゾンビでしょうか?私は実際にそれについて混乱しています。プログラムが終了する前にwaitpidを最後のコード行にする必要がありますか?どんな助けもありがとう。ありがとう!

+1

これは大丈夫ですが、あなたは誤解を招くかもしれません。子プロセスがすでに終了した場合、 'waitpid'は直ちに戻ります。それ以外の場合、子供が死ぬまでブロックされます。 WNOHANGをwaitpidと一緒に使用しない限り、ブロックされませんが、ここで問題にはなりません。 – Duck

+0

私が間違っている場合は私を修正しますが、私は3番目のパラメータ(ゼロ)はWHOHANGと同等であると思います。とにかく、WHOHANGだったとしよう。ゾンビが作成され、どのようにしますか?最後に、waitpidがreturn 0の前の最後のコマンドであるべきかどうか。ゾンビが作成されないようにします。再度、感謝します! – mgus

+1

いいえ、WNOHANGはゼロには当てはまりません。ゼロはデフォルトであり、ビット単位では意味をなさないでしょう。つまり、0に等しい場合はWNOHANGになります。子が非ブロック型の 'waitpid'の後で死んで、親が最初に終了した場合ゾンビがあります。しかし、通常はループ内に非ブロック型の 'waitpid'を使用し、おそらくSIGCHLDを受け取ることと組み合わせて使用​​します。 Waitpid自体は、あなたの子供がそう呼ばれたときにあなたの子供を扱う限り、コード内のどこにでも置くことができます。 – Duck

答えて

6

子は、それがを終了した場合、親がいる限り、それ自体が生き続けとしてwait*()を呼び出すことはありませんゾンビになります。

瞬間に親も子供が、それが最終的に終了し、これでゾンビ状態のままにしてプロセスリストから消えますので、子供にwait*()を呼び出すために世話をします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; 
} 

により2次の事実に:

  • 子供が3秒のために眠りますしたがって、waitpid()への親の呼び出しは、おそらく常に失敗するでしょう
  • SIGCHLDのデフォルト処理はそれを無視することです。

実際には上記のコードは同じです:

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

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

    if (p != 0) 
    { 
     pause(); /* Suspend main task. */ 
    } 
    else 
    { 
     sleep(3); /* Just let the child live for some tme before becoming a zombie. */ 
    } 

    return 0; 
} 
+0

子供がゾンビになるのを防ぐこのコードの内容は何ですか?スリープと一時停止コマンドを使用した理由をより詳しく説明できますか?申し訳ありませんが多くの質問が、私はこれらの概念に精通していません。 – mgus

+0

@Konstantinosコンスタン:「*ゾンビになってから子供を防ぐこのコードには何が*?」何もありません。私の答えで述べたように、このコード**はゾンビを作成します**。 – alk

0

私はゾンビプロセスを作成し、

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

void main() 
{ 
    pid_t pid; 
    pid = fork(); 
    //parent sleeps while the child has exited 
    //not an orphan since parent still alive 
    //child will be still present in process table 
    if(pid==0) 
    {//child 
     exit(0); 
    } 
    else 
    {//parent 
     sleep(15); 
    } 
} 

実行PS -e PSを使用して、それをテストするための簡単な方法を見つけました - 15秒以内に... あなたが表示されます

6454 pts/2 00:00:00 a.out <無効>

関連する問題