2016-11-17 6 views
0

Как избежать зомбических процессов? и что именно делает процесс init в этой ситуации?
Я видел эту программу, но не в состоянии получить его: Как эта программа создает процесс зомби:Как избежать процессов зомби? и что именно делает процесс init в этой ситуации?

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(void) 
{ 
    pid_t p = fork(); 

    if (p != 0) 
    { 
     waitpid(p, NULL, 0); /* See if the child already had ended. */ 
     sleep(1); /* Wait 1 seconds for the child to end. And eat away the SIGCHLD in case if arrived. */ 
     pause(); /* Suspend main task. */ 
    } 
    else 
    { 
     sleep(3); /* Just let the child live for some tme before becoming a zombie. */ 
    } 

    return 0; 
} 
+0

Что именно вы пытаетесь понять здесь? Какие у вас проблемы с кодом? –

+0

код в порядке. Имеет рабочий код, взятый из некоторой ссылки. Просто хотел, чтобы его объяснение .. То, как это создает процесс зомби. – pankaj

+0

Инициалу нечего делать в этой ситуации. Когда процесс завершается перед ожиданием статуса возврата его порожденных детей, созданные процессы становятся «зомбическими процессами» после завершения, пока init 'ждет. В вашем случае ожидает процесс родительского процесса. Поэтому init не имеет ничего общего. –

ответ

0

Дочерний процесс превращается в процесс зомби, когда он сделал выход, но родительский процесс сделал еще не запущен waitpid, wait или waitid на нем. В нормальной ситуации родитель хотел узнать статус выхода на дочерний процесс, который он породил, и, следовательно, woud запустить waitpid на pid, полученном от fork.

Что происходит в вашем коде выше:

  • ребенок породил и выходит (выходит пункт еще и возвращает 0)
  • родитель работает в бесконечном pause цикле, пока вы не нажмете Ctrl-C (сон и waitpid являются superflous)

Если запустить программу и оставить ее работать (./a.out &), а затем запустить ps -fx, то вы увидите что-то вроде этого:

6940 pts/1 SN  0:00  ./a.out 
6943 pts/1 ZN  0:00  \_ [a.out] <defunct> 

Теперь, если вы убьете родительский процесс (kill 6940), тогда ребенок станет сиротой, и процесс init автоматически станет новым родителем. Поскольку процесс init запускает waitpid (иначе «пожинает» ребенка) на всех процессах, которые он наследует, процесс зомби окончательно удаляется из таблицы процессов и больше не отображается через ps -f