Как я могу предотвратить дочерние процессы зомби?

Я пишу сервер, который использует fork() для создания обработчиков для клиентских подключений. Серверу не нужно знать, что происходит с разветвленными процессами - они работают сами по себе, и когда они закончатся, они должны просто умереть, а не стать зомби. Что это простой способ сделать это?

Ответ 1

Существует несколько способов, но использование sigaction с SA_NOCLDWAIT в родительском процессе, вероятно, является самым простым:

struct sigaction sigchld_action = {
  .sa_handler = SIG_DFL,
  .sa_flags = SA_NOCLDWAIT
};
sigaction(SIGCHLD, &sigchld_action, NULL);

Ответ 2

Используйте двойные вилки. Попросите своих детей сразу же разблокировать другую копию и выпустить исходный дочерний процесс.

http://thinkiii.blogspot.com/2009/12/double-fork-to-avoid-zombie-process.html

Это проще, чем использование сигналов, на мой взгляд, и более понятно.

void safe_fork()
{
  pid_t pid;
  if (!pid=fork()) {
    if (!fork()) {
      /* this is the child that keeps going */
      do_something(); /* or exec */
    } else {
      /* the first child process exits */
      exit(0);
    }
  } else {
    /* this is the original process */  
    /* wait for the first child to exit which it will immediately */
    waitpid(pid);
  }
}

Ответ 3

Как избавиться от процессов зомби?

вы не можете убить процесс зомби сигналом SIGKILL, поскольку вы убиваете нормальный процесс, так как процесс зомби не может получить какой-либо сигнал. поэтому иметь хорошую привычку очень важно.

Тогда при программировании, как избавиться от количества зомби-процессов? Согласно вышеприведенному описанию, дочерний процесс будет отправлять сигналы SIGCHLD в родительский процесс, когда он умирает. по умолчанию этот сигнал игнорируется системой, поэтому наилучшим способом является то, что мы можем вызвать wait() в функции обработки сигнала, что может избежать использования зомби в системе. подробнее об этом: http://itsprite.com/how-to-deep-understand-the-zombie-process-in-linux/