2016-04-13 3 views
1

Я писал программы для создания процесса зомби (с целью обучения).Как создать процесс зомби?

int main(int argc, char *argv[]) { 

    int i = ::fork(); 

    if(i == 0) sleep(30); 
    else printf("process %d/%d\n", getpid(), i); 

    return 0; 

} 

Приведенный выше код вызова fork без waitpid на дочернем процессе. Однако после запуска этого кода я использую ps aux | grep 'Z', пытаясь найти процесс зомби. Я ничего не видел. Детский процесс появляется в списке процессов, и вскоре после 30 секунд (sleep) он исчез, и я ничего не обнаружил со статусом 'Z' в списке процессов. Создает ли этот код процесс зомби?

+1

Вы не создали зомби, вы создали сироту. – EOF

+0

Как создать зомби в этом случае? – Jes

+1

Итак, если родитель умирает перед ребенком, ребенок становится сиротой (достаточно очевидно). Если ребенок умирает перед родителем, ребенок превращается в зомби, пока родительский 'wait()' s для него. – EOF

ответ

2
int main(int argc, char *argv[]) 
{ 
    int i = fork(); 

    if(i == 0) 
    { 
     exit(0); /* we let the child die as fast as possible */ 
    } else { 
     printf("process %d/%d\n", getpid(), i); 
     sleep(30); /* during these 30 sec, the child is a zombie, because it is dead, but not reaped with waitpid yet. Use ps command during this to see it in the process list */ 
    } 
    /* when we do not reap the child before we exit, it will either be removed by OS or reaped by init as it is reparented */ 
    return 0; 
} 
Смежные вопросы