Запутался в зомби-процессах в программировании на C

Вопрос: как определить, какой из них создает "зомби процесс"

// Case 1

while(fork())

    ; 

exit(0);


// Case 2

while(!fork())

     ;

exit(0);

Я знаю, что "зомби" - это когда процесс завершается и все еще потребляет ресурсы. (Или, по крайней мере, я думаю, что это так)

Я думаю, что Случай 1 — это случай, в котором создается зомби-процесс, потому что он вернет -1 в случае ошибки, а while(-1) = true, поэтому он просто продолжать разветвляться? Я не совсем уверен. Любое понимание было бы здорово,

Кстати: этот код выполняется в среде Linux на языке программирования c.

заранее спасибо


person Community    schedule 27.04.2016    source источник
comment
Ни один из них не является зомби-процессом. Один из них может создавать зомби-процессы.   -  person user253751    schedule 27.04.2016
comment
Это первый случай?   -  person    schedule 27.04.2016
comment
Процесс-зомби — это процесс, родительский процесс которого все еще существует, но не был уведомлен о завершении. В системах типа *nix это уведомление требует, чтобы родитель не просто сообщил, что один из его дочерних элементов ушел, но, скорее, он должен явно вызвать функцию (такую ​​как wait() и другие), которая блокирует получение уведомления. У вас будет зомби каждый раз, когда вы создаете потомка, и этот потомок завершается, и вы не завершаете и не вызываете одну из функций ожидания.   -  person mah    schedule 27.04.2016


Ответы (1)


Процесс-зомби — это дочерний процесс, который завершился, но не дождался родительского процесса. Дочерние процессы обычно создаются с помощью fork:

int pid = fork();
if (pid < 0) {
     // fork failed
} else if (pid == 0) {
    // this is the child process
}
// this is the parent

fork возвращает 0 дочернему процессу и положительный pid родительскому процессу. Возможны два случая прекращения их действия:

  1. дочерний процесс завершается раньше родительского, затем дочерний процесс становится «зомби» до тех пор, пока родитель не вызовет функции семейства ожидания, чтобы получить статус выхода дочернего процесса.

  2. родительский выход перед дочерним, тогда дочерний процесс будет переподчинен процессу инициализации, процесс инициализации вызовет ожидание после выхода дочернего элемента. Это работает, потому что родитель получит сигнал SIGCHLD, когда его потомок выйдет, и он может вызвать ожидание в обработчике сигнала. Так что в этом случае зомби создаваться не будет.

Также обратите внимание, что posix определяет, что зомби не создаются, если родитель игнорирует SIGCHLD:

В POSIX.1-2001 указано, что если для SIGCHLD задано значение SIG_IGN или установлен флаг SA_NOCLDWAIT для SIGCHLD (см. ) будет блокироваться до тех пор, пока не будут завершены все дочерние процессы, а затем завершится сбоем, когда для errno будет установлено значение ECHILD. (Исходный стандарт POSIX оставил поведение при установке SIGCHLD в SIG_IGN неопределенным. Обратите внимание, что хотя по умолчанию для SIGCHLD установлено значение «игнорировать», явная установка для SIG_IGN приводит к другому обращению с дочерними процессами-зомби.)

Для двух случаев в ОП:

// Case 1
while(fork())  // same as while(fork() != 0)
    ;

exit(0);


// Case 2
while(!fork()) // same as while(fork() == 0)
    ;

exit(0);

1-й код продолжает разветвление в родительском элементе, независимо от того, успешно он или нет, и результирующие дочерние элементы немедленно завершатся, поскольку возвращаемое значение будет равно 0. Поскольку родитель зависает в цикле while, независимо от того, успешно или неудачно вилка (только вилка возвращает 0 для детей), все дети станут зомби.

Для 2-го случая родитель завершается немедленно, когда fork возвращается, но потомок будет продолжать разветвление, и этот ребенок снова сделает то же самое, то есть он выйдет немедленно, а созданный им ребенок продолжит разветвление. В этом случае, с момента выхода родителя, все его дочерние элементы будут переназначены для процесса инициализации, в результате зомби не будут созданы.

person fluter    schedule 27.04.2016
comment
ОП отредактирован. В каком случае создается зомби-процесс? - person ; 27.04.2016
comment
Ответ @Shammy обновлен, чтобы сосредоточиться на двух случаях в OP. - person fluter; 27.04.2016