Процес-зомбі
В Unix-подібних системах процес-зомбі (часто позначається, як defunct) — це процес, що завершив виконання, але все ще має запис в таблиці процесів. Цей запис потрібен, щоб батьківський процес міг прочитати код завершення. Термін процес-зомбі походить із загального визначення людини-зомбі. За цією метафорою процес-нащадок помер, але ще не був забраний смертю. На відміну від нормальних процесів, команда kill ніяк не впливає на процес-зомбі.
Коли процес завершується, вся пам’ять і пов’язані з ним ресурси звільняються для інших процесів, проте, запис процесу залишається в таблиці процесів. Батьківський процес може прочитати код завершення нащадку за допомогою системного виклику wait
, після чого процес-зомбі буде прибрано зі списку процесів. Виклик wait
може бути зроблено послідовно, але зазвичай його виконують в обробнику подій для сигналу SIGCHLD, який отримує батьківський процес, коли нащадок завершується.
Приклади
Послідовне очікування процесу-нащадка в визначеному порядку може лишити зомбі довше ніж згаданий „короткий проміжок часу“. Це не обов’язково вада в програмі, а просто концепт програмування, що не часто зустрічається.
С
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pids[5];
int i;
for (i = 4; i >= 0; --i) {
pids[i] = fork();
if (pids[i] == 0) {
sleep(i+1);
_exit(0);
}
}
for (i = 4; i >= 0; --i)
waitpid(pids[i], NULL, 0);
}
shell
#!/bin/sh
(echo bu VINRARUS &
sleep 666)&
echo Zombie is created only to 666 sec!