Mi chiedo se il seguente codice può creare zombie:Questo codice C può creare processi di zombi?
#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;
}
Quindi, il processo padre chiama la waitpid per il processo figlio, che restituisce immediatamente se il bambino non sia già uscito. Quindi, nessun zombi può sorgere finora. Ma se il bambino esce prima del comando
return 0;, allora sarebbe uno zombi? Sono davvero confuso a riguardo. L'waitpid dovrebbe essere l'ultima riga di codice prima che il programma termini? Qualsiasi aiuto sarebbe apprezzato. Grazie!
Sembra ok ma potresti avere un malinteso. L''waitpid' ritornerà immediatamente se il bambino è già morto; altrimenti bloccherà fino a quando il bambino non muore. A meno che non usi WNOHANG con waitpid, nel qual caso non bloccherà ma non è in discussione qui. – Duck
Correggimi se sbaglio, ma penso che il terzo parametro (zero) sia equivalente a WHOHANG. Ad ogni modo, supponiamo che fosse WHOHANG. Verrà creato uno zombie e come? E infine, l'waitpid dovrebbe essere l'ultimo comando prima di restituire 0; per garantire che nessuno zombi sarà creato ?. Grazie ancora! – mgus
No WNOHANG non è sicuramente equivalente a 0. Zero è il valore predefinito e non avrebbe senso bitwise o WNOHANG se fosse uguale a 0. Se il bambino è morto dopo un 'waitpid non bloccante' e il genitore è uscito prima, allora avrebbe uno zombi. Ma normalmente si usa un 'waitpid' non bloccante in un ciclo e possibilmente in combinazione con la ricezione di SIGCHLD. Waitpid stesso può trovarsi ovunque nel codice fintanto che gestisce i tuoi figli quando viene chiamato a farlo. – Duck