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

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

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

9.1.6.1. Использование функций POSIX:

wait
и
waitpid

Первоначальным системным вызовом V7 был

wait
. Более новым вызовом POSIX, основанным на возможностях BSD, является
waitpid
.
Объявления функций следующие:

#include <sys/types.h> /* POSIX */

#include <sys/wait.h>

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

wait
ждет завершения любого порожденного процесса; сведения о том, как он завершился, возвращаются в
*status
. (Вскоре мы обсудим, как интерпретировать
*status
.) Возвращаемое значение является PID завершившегося процесса или -1, если возникла ошибка.

Если порожденных процессов нет,

wait
возвращает -1 с
errno
, установленным в
ECHILD
(отсутствует порожденный процесс). В противном случае, функция ждет завершения первого порожденного процесса или поступления сигнала.

Функция

waitpid
дает возможность ждать завершения определенного порожденного процесса. Она предоставляет значительную гибкость и является предпочтительной для использования функцией. Она также возвращает PID закончившегося процесса или -1 при возникновении ошибки. Аргументы следующие:

pid_t pid

Значение указывает, завершения какого порожденного процесса ждать как по-настоящему

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

pid < -1 
Ждать завершения любого порожденного процесса с ID группы процесса, равной абсолютному значению
pid
.

pid = -1 
Ждать завершения любого порожденного процесса. Таким способом работает
wait
.

pid = 0
Ждать завершения любого порожденного процесса с ID группы процесса, равной ID группе родительского процесса.

pid > 0
Ждать завершения конкретного процесса с PID, равным
pid
.

int *status

То же, что и для

wait
.
<sys/wait.h>
определяет различные макросы, которые интерпретируют значение в
*status
, которые мы вскоре опишем

int options

Этот параметр должен быть равен либо 0, либо побитовым ИЛИ одного или более из следующих флагов:

 WNOHANG

 Если ни один порожденный процесс не завершился, вернуться немедленно. Таким способом можно периодически проверять, не закончился ли какой- нибудь порожденный процесс. (Такая периодическая проверка известна как опрашивание события.)

 WUNTRACED

 Вернуть сведения о порожденном процессе, который остановился, но еще не завершился. (Например, для управления работой.)

 WCONTINUED

 (XSI.) Вернуть сведения о порожденном процессе, который продолжился, если его статус не сообщался с момента изменения. Это также для управления работой. Этот флаг является расширением XSI и не доступен под GNU/Linux.

С заполненным значением

*status
работают несколько макросов, определяющие, что случилось. Они имеют тенденцию образовывать пары: один макрос для
определения, что что-то случилось, и если этот макрос истинен, еще один макрос позволяет получить подробности. Макросы следующие:

WIFEXITED(status)

Этот макрос не равен нулю (true), если процесс завершился (в противоположность изменению состояния).

WEXITSTATUS(status)

Этот макрос дает статус завершения; он равен восьми наименее значимым битам значения, переданного

exit
или возвращенного из
main
. Этот макрос следует использовать лишь если
WIFEXIDED(status)
равен true.

WIFSIGNALED(status)

Этот макрос не равен нулю, если процесс подвергся действию завершающего сигнала death-by-signal.

WTERMSIG(status)

Этот макрос предоставляет номер сигнала, который завершил процесс. Этот макрос следует использовать, лишь когда

WIFSIGNALED(status)
равен true.

WIFSTOPPED(status)

Этот макрос не равен нулю, если процесс был остановлен.

WSTOPSIG(status)

Этот макрос предоставляет номер сигнала, который остановил процесс. (Процесс остановить могут несколько сигналов.) Этот макрос следует использовать лишь когда

WIFSTOPPED(status)
равен true. Сигналы управления работами обсуждаются в разделе 10.8.2 «Сигналы управления работой».

WIFCONTINUED(status)

(XSI.) Этот макрос не равен нулю, если процесс был продолжен. Соответствующего макроса

WCONTSIG
нет, поскольку лишь один сигнал может вызвать продолжение процесса.

Обратите внимание, что этот макрос является расширением XSI и в частности, он недоступен в GNU/Linux. Следовательно, если вы хотите его использовать, заключите код внутри '

#ifdef WIFCONTINUED ... #endif
'.

WCOREDUMP(status)

(Общий.) Этот макрос не равен нулю, если процесс создал снимок. Снимок процесса (core dump) является образом запущенного процесса в памяти, созданном при завершении процесса. Он предназначен для использования впоследствии при отладке. Системы Unix называют файл

core
, тогда как системы GNU/Linux используют
corе.pid
, где
pid
является ID завершившегося процесса. Определенные сигналы завершают процесс и автоматически создают снимок процесса.

Обратите внимание, что этот макрос не стандартный. Системы GNU/Linux, Solaris и BSD его поддерживают, однако некоторые другие системы Unix нет. Поэтому и здесь, если нужно его использовать, заключите код внутрь '

#ifdef WCOREDUMP ... #endif
'.

Большинство программ не интересуются, почему завершился порожденный процесс; им просто нужно, что он завершился, возможно, отметив, было завершение успешным или нет. Программа GNU Coreutils

install
демонстрирует такое простое использование
fork
,
execlp
и
wait
. Опция
– s
заставляет
install
запустить для устанавливаемого двоичного исполняемого файла программу
strip
.
(strip
удаляет из исполняемого файла отладочную и прочую информацию. Это может сохранить значительное пространство. На современных системах с многогигабайтными жесткими дисками при установке редко бывает необходимо использовать
strip
для исполняемых файлов.) Вот функция
strip
из
install.с
:

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

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.50
рейтинг книги
Ермак. Телохранитель

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Принятие

Хайд Адель
3. История Ирэн
Фантастика:
попаданцы
альтернативная история
фэнтези
6.00
рейтинг книги
Принятие

Родословная. Том 1

Ткачев Андрей Юрьевич
1. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 1

Все, что шевелится

Федотов Сергей
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все, что шевелится

Запрети любить

Джейн Анна
1. Навсегда в моем сердце
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Запрети любить

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

#Бояръ-Аниме. Газлайтер. Том 24

Володин Григорий Григорьевич
24. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 24

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Как я строил магическую империю 5

Зубов Константин
5. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 5

Последний попаданец

Зубов Константин
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Последний попаданец

Отморозок 2

Поповский Андрей Владимирович
2. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 2

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8