Я пишу сервер, который использует 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/