Zastanawiam się, czy następujący kod może stworzyć zombie:Czy ten kod C może tworzyć procesy zombie?
#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;
}
Więc proces nadrzędny wywołuje waitpid dla procesu potomnego, która zwraca natychmiast, jeśli dziecko nie zostało już zakończone. Tak więc do tej pory nie mogą powstać żadne zombie. Ale jeśli dziecko wyjdzie przed komendą
return 0;, będzie to zombie? W rzeczywistości jestem zdezorientowany. Czy waitpid powinien być ostatnim wierszem kodu przed zakończeniem programu? Każda pomoc będzie doceniona. Dzięki!
To wygląda dobrze, ale możesz mieć nieporozumienie. 'Waitpid' zwróci natychmiast, jeśli dziecko już umarło; w przeciwnym razie zablokuje się, dopóki dziecko nie umrze. O ile nie użyjesz WNOHANG z waitpidem, w takim przypadku nie będzie blokował, ale nie ma tu mowy. – Duck
Popraw mnie, jeśli się mylę, ale myślę, że trzeci parametr (zero) jest równoważny WHOHANG. W każdym razie, załóżmy, że to było WHOHANG. Czy wtedy powstanie zombie i jak? I wreszcie, czy waitpid będzie ostatnim poleceniem przed powrotem 0; aby upewnić się, że żadne zombie nie zostaną stworzone ?. Dzięki jeszcze raz! – mgus
No WNOHANG zdecydowanie nie jest równoważne 0. Zero jest domyślne i nie ma sensu bitwise - lub WNOHANG, jeśli było równe 0. Jeśli dziecko zmarło po niezablokowaniu 'waitpid', a rodzic wyszedł pierwszy, to miałbym zombie. Ale normalnie używałbyś nie blokującego 'waitpid' w pętli i prawdopodobnie w połączeniu z odbiorem SIGCHLD. Sam Waitpid może znajdować się w dowolnym miejscu kodu tak długo, jak obsługuje on twoje dzieci, gdy zostanie do tego wezwany. – Duck