2013-06-21 4 views
4

Мне просто интересно, что происходит с процессом зомби, если это родитель, не стоит дожидаться этого.Что происходит после завершения родительского процесса зомби?

Предположим, у нас есть родитель и ребенок. Ребенок завершается до того, как родитель делает это.

От APUE:

Ядра хранит небольшое количество информации для каждого процесса, истекающего ... Минимально
этой информации состоит из идентификатора процесса, статуса завершения процесса ....

Родитель должен получить эту информацию, используя waitpid().
Но если, родительский выход, не дожидаясь ребенка, что происходит:

Удаляет ли ядро ​​эту информацию (конечно, это бесполезно)?
Или он продолжает собирать этот мусор?
Это конкретная реализация?
Или, есть ли стандартный способ справиться с этой ситуацией?

+0

[ 'INIT process'] (http://en.wikipedia.org/wiki/Init) стать родителем дочернего процесса, инициализировать флеш запись из таблицы процессов. –

ответ

6

Сиротские процессы автоматически принимаются init, который имеет стандартный обработчик SIGCHLD, который просто отбрасывает любой статус выхода мертвого процесса.

В вашем случае, если родительский процесс зомби умирает, сиротка-зомби будет принята init и очищена.

Следующие тесты кода это:

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 


int main() { 
    pid_t child_pid; 
    if (child_pid = fork()) { // fork a child, child will exit straight away 
     char name[128]; 
     sprintf(name, "/proc/%d/stat", child_pid); 
     char line[2048]; 

     // read childs /proc/pid/stat, field 3 will give its status 
     FILE * fp = fopen(name, "r"); 

     while (fgets(line, sizeof(line), fp)) 
      puts(line); 

     fclose(fp); 

     usleep(5000000); 

     // by now the child will have exited for sure, repeat 
     fp = fopen(name, "r"); 

     while (fgets(line, sizeof(line), fp)) 
      puts(line); 

     fclose(fp); 

     // make another child to repeat the process and exit the parent 
     if (!fork()) { 
      usleep(5000000); 
      // both parent and child will have exited by now 

      fp = fopen(name, "r"); 

      // this should fail because init has already cleaned up the child 
      if (!fp) { 
       perror("fopen"); 
       return -1; 
      } 

      while (fgets(line, sizeof(line), fp)) 
       puts(line); 

      fclose(fp); 
     } 

    } 

    return 0; 
} 
+0

Поскольку дочерний элемент уже завершен, будет ли генерироваться сигнал 'SIGCHLD'? Я думал, что он сгенерирован, когда ребенок заканчивается (исправьте меня, если я ошибаюсь). – mohit

+0

@mohit Хороший вопрос, возможно, нет. Не могу сказать, потому что я не знаю, как принять процесс в пользовательском процессе. В любом случае 'init' очищает ребенка, отбрасывая его статус выхода. Все введение init было введено, чтобы убедиться, что зомби-сироты не остаются в системе. –

+0

+1, для программы. Это действительно объясняет, что происходит. Тем не менее, меня интересует, как это реализовано. И если это конкретная реализация, или существует стандартный способ. – mohit

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