мне интересно, если следующий код может создать зомби:Может ли этот 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
Исправьте меня, если я ошибаюсь, но я думаю, что третий параметр (ноль) эквивалентен WHOHANG. В любом случае, давайте предположим, что это КТО ХОРОШО. Тогда будет создан зомби и как? И, наконец, если waitpid будет последней командой перед возвратом 0; чтобы не было создано никаких зомби ?. Еще раз спасибо! – mgus
Нет. WNOHANG определенно не эквивалентен 0. Zero является значением по умолчанию, и это не имеет смысла для поразрядного - или WNOHANG, если оно равно 0. Если ребенок умер после неблокирующего «waitpid», а родительский вышел первым, то вы будет зомби. Но обычно вы должны использовать неблокирующий «waitpid» в цикле и, возможно, в сочетании с получением SIGCHLD. Сам Waitpid может быть где угодно в коде, если он обращается с вашими детьми, когда этого требуют. – Duck