Книга: Программирование для Linux. Профессиональный подход

Листинг 3.6. (zombie.c) Создание процесса-зомби

Листинг 3.6. (zombie.c) Создание процесса-зомби

#include «stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
 pid_t child_pid;
 /* Создание дочернего процесса. */
 child_pid = fork();
 if (child_pid > 0) {
  /* Это родительский процесс — делаем минутную паузу. */
  sleep(60);
 } else {
  /* Это дочерний процесс — немедленно завершаем работу. */
  exit(0);
 }
 return 0;
}

Скомпилируйте этот файл и запустите программу. Пока программа работает, перейдите в другое окно и просмотрите список процессов с помощью следующей команды:

% ps -е -o pid,ppid,stat,cmd

Эта команда отображает идентификатор самого процесса и его предка, а также статус процесса и его командную строку. Обратите внимание на присутствие двух процессов с именем zombie. Один из них — предок, другой — потомок. У последнего идентификатор родительского процесса равен идентификатору основного процесса zombie, при этом потомок обозначен как <defunct> (несуществующий), а его код состояния равен Z (т.е. zombie — зомби).

Итак, мы хотим узнать, что будет, когда программа zombie завершится, не вызвав функцию wait(). Останется ли процесс-зомби? Нет — выполните команду ps и убедитесь в этом: оба процесса zombie исчезли. Дело в том, что после завершения программы управление ее дочерними процессами принимает на себя специальный процесс — демон init, который всегда работает, имея идентификатор 1 (это первый процесс, запускаемый при загрузке Linux). Демон init автоматически удаляет все унаследованные им дочерние процессы-зомби.

Оглавление книги


Генерация: 1.543. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз