Троан Эрик В.
Шрифт:
Этот системный вызов устанавливает обработчик сигнала
Обработка сигнала ядром полностью описывается структурой
Здесь
Программа также специфицирует набор сигналов, которые должны блокироваться во время функционирования обработчика сигнала. Если обработчик предназначен для обработки нескольких различных сигналов (что легко сделать благодаря параметру
Член
SA_NOCLDSTOP | Обычно SIGCHLD генерируется, когда один из потомков процесса прерван или приостановлен (то есть всякий раз, когда wait4 должен вернуть информацию о состоянии процесса). Если флаг SA_NOCLDSTOP указан для сигнала SIGCHLD , то сигнал генерируется лишь в случае прерывания дочернего процесса; приостановка дочернего процесса не приводит к генерации каких-либо сигналов. SA_NOCLDSTOP не оказывает влияния ни на какой другой сигнал. |
SA_NODEFER | Когда вызывается обработчик сигнала, сигнал автоматически не блокируется. Применение этого флага приводит к ненадежным сигналам, и он должен использоваться только для эмуляции ненадежных сигналов в приложениях, зависящих от такого поведения. Это идентично флагу SA_NOMASK в System V. |
SA_RESETHAND | Когда присылается сигнал, обработчик сбрасывается в SIG_DFL. Этот флаг позволяет эмулировать функцию ANSI/ISO signal в библиотеке пользовательского пространства. Идентично флагу SA_ONESHOT в System V. |
SA_RESTART | Когда сигнал посылается процессу во время выполнения медленного системного вызова, системный вызов перезапускается после возврата управления из обработчика. Если флаг не указан, то системный вызов в этом случае возвращает ошибку и устанавливает errno равным EINTR . |
61
Эти флаги определены в Single Unix Specification. Многие из них имеют имена, отличающиеся от описанных в тексте.
12.2.4. Манипулирование маской сигналов процесса
Манипулировать структурами данных, которые используются в других частях программы — обычное дело для обработчика сигналов. К сожалению, асинхронная природа сигналов делает это опасным, если только не обращаться с этим с осторожностью. Манипулирование всеми, за исключением простейших структур данных, приводит программу к состоянию состязаний.
Пример немного прояснит эту проблему. Ниже показан простой обработчик
В реальных программах новое значение
Когда главная часть программы возобновит выполнение,
Чтобы решать проблемы такого типа, программный интерфейс сигналов POSIX позволяет процессу блокировать доставку процессу произвольного набора сигналов. При этом сигналы не отбрасываются, просто их доставка задерживается до тех пор, пока процесс не обозначит свою готовность обработать эти сигналы, разблокировав их. Чтобы правильно выполнить показанное выше копирование строки, программа должна блокировать
62
Хотя ссылка на память, которая может быть заполнена, может работать в некоторых системах, это не является переносимым. Некоторые реализации
Набор сигналов, которые процесс блокирует, часто называют
Первый параметр,