Имя сигнала |
Описание |
SA_NOCLDSTOP |
Не генерируется SIGCHLD , когда дочерние процессы остановлены |
SA_RESETHAND |
Восстанавливает при получении действие, соответствующее значению SIG_DFL |
SA_RESTART |
Перезапускает прерванные функции вместо ошибки EINTR |
SA_NODEFER |
При перехвате сигнала не добавляет его а маску сигналов |
Флаг SA_RESETHAND
может применяться для автоматической очистки функции сигнала при захвате сигнала, как мы видели раньше.
Многие системные вызовы, которые использует программа, прерываемые, т.е. при получении сигнала они вернутся с ошибкой и переменная errno
получит значение EINTR
, чтобы указать, что функция вернула управление в результате получения сигнала. Поведение требует повышенного внимания со стороны приложения, использующего сигналы. Если в поле sa_flags
функции sigaction
установлен флаг SA_RESTART
, функция, которая в противном случае могла быть прервана сигналом, вместо этого будет возобновлена, как только выполнится функция обработки сигнала.
Обычно, когда функция обработки сигнала выполняется, полученный сигнал добавляется в маску сигналов процесса во время работы функции обработки. Это препятствует последующему появлению того же сигнала, заставляющему функцию обработки сигнала выполняться снова. Если функция не реентерабельная, вызов ее другим экземпляром сигнала до того, как она завершит обработку первого сигнала, может создать проблемы. Но если установлен флаг SA_NODEFER
, маска сигнала не меняется при получении этого сигнала.
Функция обработки сигнала может быть прервана в середине и вызвана снова чем-нибудь еще. Когда вы возвращаетесь к первому вызову функции, крайне важно, чтобы она все еще действовала корректно. Она должна быть не просто рекурсивной (вызывающей саму себя), а реентерабельной (в нее можно войти и выполнить ее снова). Подпрограммы ядра, обслуживающие прерывания и имеющие дело с несколькими устройствами одновременно, должны быть реентерабельными, поскольку высокоприоритетное прерывание может "войти" в тот код, который выполняется.
Функции, которые безопасно вызываются в обработчике сигнала и в стандарте X/Open гарантированно описанные либо как реентерабельные, либо как самостоятельно не возбуждающие сигналов, перечислены в табл. 11.6.
Все функции, не включенные в табл. 11.6, следует считать небезопасными в том, что касается сигналов.
Таблица 11.6
access |
alarm |
cfgetispeed |
cfgetospeed |
cfsetispeed |
cfsetospeed |
chdir |
chmod |
chown |
close |
creat |
dup2 |
dup |
execle |
execve |
exit |
fcntl |
fork |
fstat |
getegid |
geteuid |
getgid |
getgroups |
getpgrp |
getpid |
getppid |
getuid |
kill |
link |
lseek |
mkdir |
mkfifo |
open |
pathconf |
pause |
pipe |
read |
rename |
rmdir |
setgid |
setpgid |
setsid |
setuid |
sigaction |
sigaddset |
sigdelset |
sigemptyset |
sigfillset |
sigismember |
signal |
sigpending |
sigprocmask |
sigsuspend |
sleep |
stat |
sysconf |
tcdrain |
tcflow |
tcflush |
tcgetattr |
tcgetpgrp |
tcsendbreak |
tcsetattr |
tcsetpgrp |
time |
times |
umask |
uname |
unlink |
utime |
wait |
waitpid |
write |
|
|
|
Общая сводка сигналов
В этом разделе мы перечисляем сигналы, в которых нуждаются программы Linux и UNIX для обеспечения стандартных реакций.
Стандартное действие для сигналов, перечисленных в табл. 11.7, — аварийное завершение процесса со всеми последствиями вызова функции _exit
(которая похожа на exit
, но не выполняет никакой очистки перед возвратом управления ядру). Тем не менее, состояние становится доступным функции wait
, а функция waitpid
указывает на аварийное завершение, вызванное описанным сигналом.
Таблица 11.7
Читать дальше