SIGSET(2) SIGSET(2) НАЗВАНИЕ sigset, sighold, sigrelse, sigignore, sigpause - управ- ление сигналами СИНТАКСИС |#include | |void (*sigset (sig, func)) ( ) |int sig; |void (*func) ( ); | |int sighold (sig) |int sig; | |int sigrelse (sig) |int sig; | |int sigignore (sig) |int sig; | |int sigpause (sig) |int sig; ОПИСАНИЕ Перечисленные системные вызовы составляют механизм уп- равления сигналами для прикладных процессов. Системный вызов sigset аналогичен вызову signal(2) с одним важным дополнением: sigset позволяет откладывать сигналы. Ниже описаны только отличия sigset от signal. Аргумент func, помимо SIG_DFL, SIG_IGN и адреса функ- ции, может принимать еще одно значение: SIG_HOLD - откладывание сигнала При получении сигнала sig он будет отложен. Если в момент обращения к sigset уже существовал отложен- ный сигнал sig, он остается таковым. Может быть отложен только один сигнал каждого типа - осталь- ные пропадают. При установлении стандартной реакции на сигнал (SIG_DFL) ранее отложенный сигнал sig (если он был) становится активным. При установлении режима игнорирования сигнала (SIG_IGN) ранее отложенный сигнал sig (если он был) пропадает. При установлении режима перехвата сигнала (когда в ка честве аргумента func выступает адрес функции) ранее отложенный сигнал sig (если он был) становится актив- ным. Адрес функции обработки сигнала сохраняется сис- темными вызовами, описанными ниже. После получения сигнала, но перед вызовом функции обра- ботки устанавливается режим откладывания (SIG_HOLD). Во время нормального возврата из этой функции она восста- навливается в качестве обработчика [это еще одно отли- чие от signal(2)], а ранее отложенный сигнал sig (если он был) становится активным. Если выход из функции об- работки осуществлялся нелокальным переходом [см. setjmp(3C)], для восстановления специфицированной поль- зователем реакции на сигнал и активизации отложенного сигнала следует воспользоваться описанным ниже систем- ным вызовом sigrelse. Системные вызовы sighold и sigrelse используются для обрамления критического интервала. Sighold устанавлива- ет для сигнала sig режим откладывания; sigrelse восста- навливает реакцию на сигнал sig, специфицированную об- ращением к sigset, и активизирует отложенный сигнал, если он был. Системный вызов sigignore устанавливает режим игнориро- вания сигнала sig. Если отвлечься от возвращаемого зна чения, вызов sigignore (sig) эквивалентен sigset (sig, SIG_IGN). Системный вызов sigpause аналогичен pause(2) с одним отличием: при наличии отложенного сигнала sig он акти- визируется и выполняется его обработка, после чего вы зывающий процесс продолжает работу. Данный системный вызов полезен при проверке значений переменных, изменя- емых функцией обработки сигнала. Рекомендуется сначала посредством sighold заблокировать сигнал sig, затем проверить значения переменных. Если они не были измене ны, с помощью sigpause следует дождаться сигнала. СМ. ТАКЖЕ pause(2), signal(2), setjmp(3C). ДИАГНОСТИКА И в смысле возвращаемого значения системный вызов sigset аналогичен вызову signal. При успешном завершении системных вызовов, отличных от sigset, результат равен 0; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки. ПРЕДОСТЕРЕЖЕНИЯ Не следует использовать системные вызовы signal(2) и pause(2) совместно с описанными в данной статье средст- вами.@