Книга: 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()

Оглавление книги


Генерация: 2.641. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз