Создание зомби-процесса
Я заинтересован в создании процесса зомбирования. Насколько я понимаю, процесс зомби происходит, когда родительский процесс завершается до завершения дочернего процесса. Тем не менее, я попытался воссоздать процесс зомби, используя следующий код:
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
exit(0);
}
else {
sleep(100);
exit (0);
}
return 0;
}
однако, этот код завершается сразу после выполнения которых ожидается. Впрочем, как и я!--3-->
ps aux | grep a.out
Я нашел.out работает как обычный процесс, а не как процесс зомби, как я ожидал.
ОС я использование ubuntu 14.04 64 бит
1 ответов
цитирую:
насколько я понимаю, процесс зомби происходит, когда родительский процесс выходит перед процессом детей.
это неправильно. Согласно man 2 wait
(см. Примечания) :
ребенок, который заканчивается, но не ждали, становится "зомби".
Итак, если вы хотите создать процесс-зомби, после fork(2)
, дочерний процесс должен exit()
, и родительский процесс должен!--4--> перед выходом, давая вам время, чтобы наблюдать выход ps(1)
.
например, вы можете использовать приведенный ниже код вместо вашего и использовать ps(1)
пока sleep()
ing:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
/* Child */
if (pid == 0)
exit(0);
/* Parent
* Gives you time to observe the zombie using ps(1) ... */
sleep(100);
/* ... and after that, parent wait(2)s its child's
* exit status, and prints a relevant message. */
pid = wait(&status);
if (WIFEXITED(status))
fprintf(stderr, "\n\t[%d]\tProcess %d exited with status %d.\n",
(int) getpid(), pid, WEXITSTATUS(status));
return 0;
}