Процес-зомбі

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

В 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!

Посилання[ред. | ред. код]