Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

Ниже приведена доработанная версия функции

main
из файла
fork-exec.c
. На этот раз программа вызывает функцию
wait
, чтобы дождаться завершения дочернего процесса, в котором выполняется команда
ls
.

int main {

 int child_status;

 /* Список аргументов, передаваемых команде ls. */

 char* arg_list[] = {

"ls", /* argv[0] — имя программы. */

"-l",

"/",

NULL /* Список аргументов должен оканчиваться указателем

NULL. */

 };

 /* Порождаем дочерний процесс, который выполняет команду ls.

Игнорируем возвращаемый идентификатор дочернего процесса. */

 spawn("ls*, arg_list);

 /* Дожидаемся завершения дочернего процесса. */

 wait(&child_status);

 if (WTFEXITED(child_status));

 printf("the child process exited normally, with exit code %d\n",

WEXITSTATUS(child_status));

 else

printf("the child process exited abnormally\n");

 return 0;

}

Расскажем о других функциях семейства. Функция

waitpid
позволяет дождаться завершения конкретного дочернего процесса, а не просто любого. Функция
wait3
возвращает информацию о статистике использования центрального процессора завершившимся дочерним процессом. Функция
wait4
позволяет задать дополнительную информацию о том, завершения каких процессов следует дождаться.

3.4.3. Процессы-зомби

Если дочерний процесс завершается в то время, когда родительский процесс заблокирован функцией

wait
, он успешно удаляется и его код завершения передается предку через функцию
wait
. Но что произойдет, если потомок завершился, а родительский процесс так и не вызвал функцию
wait
? Дочерний процесс просто исчезнет? Нет, ведь в этом случае информация о его завершении (было ли оно аварийным или нет и каков код завершения) пропадет. Вместо этого дочерний процесс становится процессом-зомби.

Зомби — это процесс, который завершился, но не был удален. Удаление зомби возлагается на родительский процесс. Функция

wait
тоже это делает, поэтому перед ее вызовом не нужно проверять, продолжает ли выполняться требуемый дочерний процесс. Предположим, к примеру, что программа создает дочерний процесс, выполняет нужные вычисления и затем вызывает функцию
wait
. Если к тому времени дочерний процесс еще не завершился, функция
wait
заблокирует программу. В противном случае процесс на некоторое время превратится в зомби. Тогда функция
wait
извлечет код его завершения, система удалит процесс и функция немедленно завершится.

Что же всё-таки случится, если родительский процесс не удалит своих потомков? Они останутся в системе в виде зомби. Программа, показанная в листинге 3.6, порождает дочерний процесс, который немедленно завершается, тогда как родительский процесс берет минутную паузу, после чего тоже заканчивает работу, так и не позаботившись об удалении потомка.

Листинг 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 — зомби).

  • Читать дальше
  • 1
  • ...
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: