Чтение онлайн

на главную

Жанры

Основы программирования в Linux
Шрифт:

Интерпретировать информацию о состоянии процесса можно с помощью макросов, описанных в файле sys/wait.h и приведенных в табл. 11.2.

Таблица 11.2

Макрос Описание
WIFEXITED(stat_val)
Ненулевой, если дочерний процесс завершен нормально
WEXITSTATUS(stat_val)
Если
WIFEXITED
ненулевой, возвращает код завершения дочернего процесса
WIFSIGNALED(stat_val)
Ненулевой,
если дочерний процесс завершается неперехватываемым сигналом
WTERMSIG(stat_val)
Если
WIFSIGNALED
ненулевой, возвращает номер сигнала
WIFSTOPPED(stat_val)
Ненулевой, если дочерний процесс остановился
WSTOPSIG(stat_val)
Если
WIFSTOPPED
ненулевой, возвращает номер сигнала

Выполните упражнение 11.4.

Упражнение 11.4. Системный вызов
wait

В этом упражнении вы слегка измените программу, чтобы можно было подождать и проверить код состояния дочернего процесса. Назовите новую программу wait.c.

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

int main {

 pid_t pid;

 char* message;

 int n;

 int exit_code;

 printf("fork program starting\n");

 pid = fork;

 switch(pid) {

 case -1:

perror("fork failed");

exit(1);

 case 0:

message = "This is the child";

n = 5;

exit_code = 37;

break;

 default:

message = "This is the parent";

n = 3;

exit_code = 0;

break;

 }

 for (; n > 0; n--) {

puts(message);

sleep(1);

 }

Следующий фрагмент программы ждет окончания дочернего процесса:

 if (pid != 0) {

int stat_val;

pid_t child_pid;

child_pid = wait(&stat_val);

printf("Child has finished: PID = %d\n", child_pid);

if (WIFEXITED(stat_val))

printf("Child exited with code %d\n", WEXITSTATUS(stat_val));

else printf("Child terminated abnormally\n");

 }

 exit(exit_code);

}

Когда

вы выполните эту программу, то увидите, что родительский процесс ждет дочерний:

$ ./wait

fork program starting

This is the child

This is the parent

This is the parent

This is the child

This is the parent

This is the child

This is the child

This is the child

Child has finished: PID = 1582

Child exited with code 37

$

Как это работает

Родительский процесс, получивший ненулевое значение, возвращенное из вызова

fork
, применяет системный вызов
wait
для приостановки своего выполнения до тех пор, пока информация о состоянии дочернего процесса не станет доступной. Это произойдет, когда дочерний процесс вызовет функцию
exit
; мы присвоили ему код завершения 37. Далее родительский процесс продолжается, определяет, протестировав значение, возвращенное вызовом
wait
, что дочерний процесс завершился нормально, и извлекает код завершения из информации о состоянии процесса.

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

Применение вызова

fork
для создания процессов может оказаться очень полезным, но вы должны отслеживать дочерние процессы. Когда дочерний процесс завершается, связь его с родителем сохраняется до тех пор, пока родительский процесс в свою очередь не завершится нормально, или не вызовет
wait
. Следовательно, запись о дочернем процессе не исчезает из таблицы процессов немедленно. Становясь неактивным, дочерний процесс все еще остается в системе, поскольку его код завершения должен быть сохранен, на случай если родительский процесс в дальнейшем вызовет
wait
. Он становится умершим или процессом-зомби.

Вы сможете увидеть создание процесса-зомби, если измените количество сообщений в программе из примера с вызовом

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

Упражнение 11.5. Зомби

Программа fork2.c такая же, как программа fork1.с, за исключением того, что количества сообщений, выводимых родительским и дочерним процессами, поменяли местами. Далее приведены соответствующие строки кода:

switch (pid) {

case -1:

 perror("fork failed");

 exit(1);

case 0:

 message = "This is the child";

 n = 3;

 break;

default:

 message = "This is the parent";

 n = 5;

 break;

}

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

Семейная энциклопедия здоровья

авторов Коллектив
Справочная литература:
энциклопедии
прочая справочная литература
5.00
рейтинг книги
Семейная энциклопедия здоровья

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.25
рейтинг книги
Дважды одаренный. Том V

Кровь, слезы и лавры

Пикуль Валентин Саввич
Исторические миниатюры
Проза:
историческая проза
5.00
рейтинг книги
Кровь, слезы и лавры

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.60
рейтинг книги
Я царь. Книга XXVIII

Козацькому роду нема переводу, або ж Мамай i Чужа Молодиця

Ильченко Александр Елисеевич
Проза:
роман
5.00
рейтинг книги
Козацькому роду нема переводу, або ж Мамай i Чужа Молодиця

Избранные сочинения в 9 томах. Том 1 Зверобой; Последний из могикан

Купер Джеймс Фенимор
1. Ф.Купер Избранные сочинения в 9 томах
Приключения:
приключения про индейцев
6.80
рейтинг книги
Избранные сочинения в 9 томах. Том 1 Зверобой; Последний из могикан

Росская империя (сборник)

Эльтеррус Иар
Росская Империя
Фантастика:
боевая фантастика
8.24
рейтинг книги
Росская империя (сборник)

Созвездие эректуса

Розов Александр Александрович
5. Конфедерация Меганезия
Фантастика:
фэнтези
5.00
рейтинг книги
Созвездие эректуса

Возвращение домой.Том 1

Пилчер Розамунда
Проза:
современная проза
8.00
рейтинг книги
Возвращение домой.Том 1

Путешественник

Юань Е
3. Повелитель тайн
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Путешественник

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.50
рейтинг книги
Воронцов. Перезагрузка

Вечно голодный студент 8

RedDetonator
8. Вечно голодный студент
Фантастика:
боевая фантастика
постапокалипсис
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Вечно голодный студент 8

Егерь. Системный зверолов

Скиба Николай
1. Зверолов
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
6.50
рейтинг книги
Егерь. Системный зверолов

Все будет по-моему! Часть 12

Wing-Span
12. Всё будет по-моему!
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Все будет по-моему! Часть 12