、私は疑問に思って:この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を最後のコード行にする必要がありますか?どんな助けもありがとう。ありがとう!
これは大丈夫ですが、あなたは誤解を招くかもしれません。子プロセスがすでに終了した場合、 'waitpid'は直ちに戻ります。それ以外の場合、子供が死ぬまでブロックされます。 WNOHANGをwaitpidと一緒に使用しない限り、ブロックされませんが、ここで問題にはなりません。 – Duck
私が間違っている場合は私を修正しますが、私は3番目のパラメータ(ゼロ)はWHOHANGと同等であると思います。とにかく、WHOHANGだったとしよう。ゾンビが作成され、どのようにしますか?最後に、waitpidがreturn 0の前の最後のコマンドであるべきかどうか。ゾンビが作成されないようにします。再度、感謝します! – mgus
いいえ、WNOHANGはゼロには当てはまりません。ゼロはデフォルトであり、ビット単位では意味をなさないでしょう。つまり、0に等しい場合はWNOHANGになります。子が非ブロック型の 'waitpid'の後で死んで、親が最初に終了した場合ゾンビがあります。しかし、通常はループ内に非ブロック型の 'waitpid'を使用し、おそらくSIGCHLDを受け取ることと組み合わせて使用します。 Waitpid自体は、あなたの子供がそう呼ばれたときにあなたの子供を扱う限り、コード内のどこにでも置くことができます。 – Duck