Книга: Linux программирование в примерах
10.4.6. Дополнительные предостережения
10.4.6. Дополнительные предостережения
Стандарт POSIX предусматривает для обработчиков сигналов несколько предостережений:
• Что случается, когда возвращаются обработчики для SIGFPE
, SIGILL
, SIGSEGV
или любых других сигналов, представляющих «вычислительные исключения», не определено.
• Если обработчик был вызван в результате вызова abort()
, raise()
или kill()
, он не может вызвать raise()
. abort()
описана в разделе 12.4 «Совершение самоубийства: abort()
», a kill()
описана далее в этой главе. (Описанная далее функция API sigaction()
с обработчиком сигнала, принимающая три аргумента, дает возможность сообщить об этом, если это имеет место.)
• Обработчики сигналов могут вызвать лишь функции из табл. 10.2. В частности, они должны избегать функций <stdio.h>
. Проблема в том, что во время работы функции <stdio.h>
может возникнуть прерывание, когда внутреннее состояние библиотечной функции находится в середине процесса обновления. Дальнейшие вызовы функций <stdio.h>
могут повредить это внутреннее состояние.
Список в табл. 10.2 происходит из раздела 2.4 тома System Interfaces (Системные интерфейсы) стандарта POSIX 2001. Многие из этих функций относятся к сложному API и больше не рассматриваются в данной книге.
Таблица 10.2. Функции, которые могут быть вызваны из обработчика сигнала
_Exit() |
fpathconf() |
raise() |
sigqueue() |
_exit() |
fstat() |
read() |
sigset() |
accept() |
fsync() |
readlink() |
sigsuspend() |
access() |
ftruncate() |
recv() |
sleep() |
aio_error() |
getegid() |
recvfrom() |
socket() |
aio_return() |
geteuid() |
recvmsg() |
socketpair() |
aio_suspend() |
getgid() |
rename() |
stat() |
alarm() |
getgroups() |
rmdir() |
sysmlink() |
bind() |
getpeername() |
select() |
sysconf() |
cfgetispeed() |
getpgrp() |
sem_post() |
tcdrain() |
cfgetospeed() |
getpid() |
send() |
tcflow() |
cfsetispeed() |
getppid() |
sendmsg() |
tcflush() |
cfsetospeed() |
getsockname() |
sendto() |
tcgetattr() |
chdir() |
getsockopt() |
setgid() |
tcgetpgrp() |
chmod() |
getuid() |
setpgid() |
tcsendbreak() |
chown() |
kill() |
setsid() |
tcsetattr() |
clock_gettime() |
link() |
setsockopt() |
tcsetpgrp() |
close() |
listen() |
setuid() |
time() |
connect() |
lseek() |
shutdown() |
timer_getoverrun() |
creat() |
lstat() |
sigaction() |
timer_gettime() |
dup() |
mkdir() |
sigaddset() |
timer_settime() |
dup2() |
mkfifo() |
sigdelset() |
times() |
execle() |
open() |
sigemptyset() |
umask() |
execve() |
pathconf() |
sigfillset() |
uname() |
fchmod() |
pause() |
sigismember() |
unlink() |
fchown() |
pipe() |
signal() |
utime() |
fcntl() |
poll() |
sigpause() |
wait() |
fdatasync() |
posix_trace_event() |
sigpending() |
waitpid() |
fork() |
pselect() |
sigprocmask() |
write() |
- 14.2.2.3. Предостережения по поводу блокировок
- Дополнительные национальные кодовые страницы и порядки сортировки
- Глава 8 Дополнительные службы
- 4.6. Дополнительные возможности защиты
- 5.2.2. Дополнительные возможности OpenSSL
- 10.5. Дополнительные настройки
- Дополнительные свойства поля
- Дополнительные сведения о gdb
- 12.4.6. Дополнительные замечания
- Дополнительные функции
- Дополнительные средства разработки .NET-приложений
- Дополнительные средства командной строки .NET