как эта программа создает зомби-процесс? - PullRequest
2 голосов
/ 11 августа 2011

Как работает приведенная ниже программа и создает процесс Zombie под Linux?

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main ()
{
  pid_t child_pid;

  child_pid = fork ();
  if (child_pid > 0) {
    sleep (60);
  }
  else {
    exit (0);
  }
  return 0;
}

Ответы [ 2 ]

8 голосов
/ 11 августа 2011

Создает детей и не ждет (с одним из системных вызовов wait) их.И зомби - это просто: дети, которых родители еще не ждали, ядро ​​должно хранить для них некоторую информацию - главным образом, статус выхода - чтобы иметь возможность вернуть ее родителю.

1 голос
/ 25 мая 2012

Команда setsid() отсутствует.

Каждый процесс * nix создает состояние выхода, которое должно быть получено.Предполагается, что родительский процесс должен пожинать его с помощью оператора wait (), если дочерний процесс должен завершиться первым.

Команда setsid() переключает родительский процесс в init, когда родительский процесс завершается до дочернего процесса.

Root должен иметь возможность удалять зомби из списка процессов с помощью kill -9.Неопытные программисты иногда опускают setsid(), что скрывает ошибки, которые приводят к ошибкам, которые в противном случае могли бы засорить дисковод.

В давние времена системный администратор использовал зомби для выявления неопытных программистов, которым необходимо дополнительное обучение для производствахороший код.

Состояние завершения, собранное init, отправляется в системный журнал, когда ядро ​​преждевременно завершает программу.Это состояние выхода используется для определения характера ошибки, которая вызвала досрочное завершение (условия ошибки не обрабатываются программистом).

Состояние выхода, сообщаемое таким образом, становится частью файлов системного журнала или klog, которые обычно используются для отладки кода.

...