2014-08-07 2 views
11

Я заинтересован в создании процесса зомби. Насколько я понимаю, процесс зомби происходит, когда родительский процесс выходит из процесса перед детьми. Тем не менее, я попытался воссоздать процесс зомби, используя следующий код:Создать зомби-процесс

#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; 
} 

Однако этот код выходит сразу после выполнения, который, как ожидается. Однако, как я

ps aux | grep a.out 

Я нашел a.out просто работает как нормальный процесс, а не процесс зомби, как я ожидал.

ОС я использую Ubuntu 14,04 64 бит

+2

Ваш код в вопросе не создает процесс зомби, потому что в вашем коде, родительский процесс выходов сначала, пока ребенок продолжает работать. (Помните, что fork() возвращает 0 в дочернем процессе и PID дочернего элемента в родительском процессе.) Чтобы увидеть процесс зомби, вам нужно заставить ребенка выйти, пока родитель все еще жив, но не дождался ребенка. Если вы просто измените строку 10 вашего кода с 'if (child_pid> 0)' на 'if (child_pid == 0)', он «исправит» ваш код, и вы сможете увидеть процесс зомби, когда ребенок выходы процесса. –

ответ

12

Цитирование:

To my understanding, zombie process happens when the parent process exits before 
the children process. 

Это неправильно. Согласно man 2 wait (см NOTES):

A child that terminates, but has not been waited for becomes a "zombie". 

Итак, если вы хотите создать процесс зомби, после fork(2), ребенок-процесс должен exit(), и родитель-процесс должен sleep() перед выходом, давая вам время для наблюдения за выходом 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; 
} 
+0

Спасибо, что так много chrk! Я пробовал ваш код, и я видел некоторые процессы зомби. Но у меня все еще есть еще одна проблема. Почему мой код не создает процесс зомби? Согласно определению в вашем сообщении, дочерний процесс завершался без ожидания родителем (родитель был выведен без команды wait). @chrk – user3354832

+1

@ user3354832 Ваш код в вопросе не создает процесс зомби, потому что в вашем коде родительский процесс выходит первым, пока ребенок продолжает работать. (Помните, что fork() возвращает 0 в дочернем процессе и PID дочернего элемента в родительском процессе.) Чтобы увидеть процесс зомби, вам нужно заставить ребенка выйти, пока родитель все еще жив, но не дождался ребенка. Если вы просто измените строку 10 вашего кода с 'if (child_pid> 0)' на 'if (child_pid == 0)', он «исправит» ваш код, и вы сможете увидеть процесс зомби, когда ребенок выходы процесса. –

Смежные вопросы