SIGNAL(2) SIGNAL(2) НАЗВАНИЕ signal - спецификация действий по обработке сигнала СИНТАКСИС |#include | |void (*signal (sig, func)) ( ) |int sig; |void (*func) ( ); ОПИСАНИЕ Системный вызов signal позволяет вызывающему процессу выбрать один из трех возможных способов реакции на по- лучение определенного сигнала. Аргументы sig и func специфицируют, соответственно, сигнал и выбор. Аргумент sig может иметь одно из следующих значений, за исключением SIGKILL: SIGHUP 01 Освобождение линии (hangup). SIGINT 02 Прерывание (interrupt). SIGQUIT 03 [1] Выход (quit). SIGILL 04 [1] Некорректная команда (illegal instructi- on). Не переустанавливается при перехва- те. SIGTRAP 05 [1] Трассировочное прерывание (trace trap). Не переустанавливается при перехвате. SIGIOT 06 [1] Машинная команда IOT. SIGABRT 06 [1] Рекомендуемый синоним предыдущего. SIGEMT 07 [1] Машинная команда EMT. SIGFPE 08 [1] Исключительная ситуация при выполнении операции с вещественными числами (floating-point exception). SIGKILL 09 Уничтожение процесса (kill). Не перехва- тывается и не игнорируется. SIGBUS 10 [1] Ошибка шины (bus error). SIGSEGV 11 [1] Некорректное обращение к сегменту памяти (segmentation violation). SIGSYS 12 [1] Некорректный параметр системного вызова (bad argument to system call). SIGPIPE 13 Запись в канал, из которого некому чи- тать (write on a pipe with no one to read it). SIGALRM 14 Будильник (alarm clock). SIGTERM 15 Программный сигнал завершения (software termination signal). SIGUSR1 16 Определяемый пользователем сигнал 1 (user-defined signal 1). SIGUSR2 17 Определяемый пользователем сигнал 2 (user-defined signal 2). SIGCLD 18 [2] Завершение порожденного процесса (death of a child). SIGPWR 19 [2] Ошибка питания (power fail). SIGPOLL 22 [3] Регистрация выборочного события (selectable event pending). Аргумент func может иметь одно из трех значений: SIG_DFL, SIG_IGN или адрес_функции. Макросы SIG_DFL и SIG_IGN определены во включаемом файле . Каж- дый из макросов порождает уникальную константу типа "указатель на функцию типа void", заведомо не соот- ветствующую определяемой функции. Действия, предписываемые аргументом func, состоят в следующем: SIG_DFL - стандартная реакция на сигнал При получении сигнала sig терминировать процесс со всеми завершающими действиями, описанными в exit(2); см. замечание [1] ниже. SIG_IGN - игнорирование сигнала Игнорировать сигнал sig. Сигнал SIGKILL не может игнорироваться. адрес_функции - перехват сигнала При получении сигнала sig выполнить функцию обра- ботки сигнала func; в качестве единственного аргу- мента функции func передается номер сигнала sig; дополнительные аргументы передаются для сигналов, вырабатываемых аппаратурой. Перед выполнением функции func устанавливается стандартная реакция на полученный сигнал, если только этот сигнал не есть SIGILL или SIGTRAP. Таким образом, чтобы пе- рехватить следующий сигнал sig, нужно вновь обра титься к signal, задав в качестве аргумента func адрес_функции. После завершения функции обработки сигнала про- цесс, получивший сигнал, возобновляет выполнение с точки прерывания. Если сигнал, который должен быть перехвачен, пос- тупил во время выполнения системных вызовов read(2), write(2), open(2) или ioctl(2) для мед- ленных устройств (таких, как терминал, но не дис- ковый файл), pause(2) или системного вызова wait(2), который не возвращает немедленно управле- ние из-за того, что порожденный процесс остановлен или терминирован, то функция обработки сигнала вы- полняется, а затем прерванный системный вызов, скорее всего, возвращает вызывающему процессу зна чение -1 и присваивает переменной errno значение EINTR. Системный вызов signal не проверяет корректность аргумента func. Последствия выполнения функции об- работки сигнала, заданной некорректным адресом, непредсказуемы. Сигнал SIGKILL перехватить нельзя. Выполнение системного вызова signal отменяет получен ный, но еще не обработанный сигнал sig, если только этот сигнал не есть SIGKILL. Системный вызов signal завершается неудачей, если: [EINVAL] Значение аргумента sig является недопусти мым номером сигнала, включая SIGKILL. ПРИМЕЧАНИЯ [1] Если для сигналов, помеченных [1], назначается стандартная реакция (SIG_DFL), то в дополнение к тому, что процесс терминируется, в текущем рабочем каталоге создается файл с образом памяти, если вы полняются следующие условия: 1. Действующий и реальный идентификаторы пользова- теля процесса, получившего сигнал, совпадают. 2. Обычный файл с именем core существует и в него можно писать, или файл core может быть создан; создаваемый файл core будет обладать следующими характеристиками: 2.1. Режим доступа 0666, модифицированный мас кой режима создания файлов [см. umask(2)]. 2.2. Идентификатор владельца файла равен дейст- вующему идентификатору пользователя про- цесса, получившего сигнал. 2.3. Идентификатор группы файла равен действую- щему идентификатору группы процесса, полу- чившего сигнал. [2] Для сигналов SIGCLD и SIGPWR, как и для других, в качестве func может использоваться одно из трех значений: SIG_DFL, SIG_IGN или адрес функции обра ботки сигнала. Однако действия, предписываемые этими значениями, отличаются от описанных выше: SIG_DFL - игнорирование сигнала SIG_IGN - игнорирование сигнала Если значение sig равно SIGCLD, то процессы, порожденные вызывающим процессом, не перейдут в состояние зомби при своем завершении [см. exit(2)]. адрес_функции - перехват сигнала Если получен сигнал SIGCLD, то на время выпол- нения функции обработки сигнала любой другой сигнал SIGCLD игнорируется. Сигнал SIGCLD взаимодействует с системными вызовами wait и exit следующим образом: wait Если значение func для сигнала SIGCLD установлено равным SIG_IGN и выполняется системный вызов wait, то после получения сигнала SIGCLD wait блокируется до завершения всех процессов, порожденных вызываю- щим процессом; затем wait возвращает -1, а пере менной errno присваивается значение ECHILD. exit Если процесс, родительский по отношению к процес- су, выполняющему exit, установил для сигнала SIGCLD действие SIG_IGN, то завершающийся процесс не переходит в состояние зомби. При использовании конвейера следует иметь в виду, что интерпретатор команд shell делает последний процесс конвейера родительским для предшествующих процессов. Процесс, который входит в конвейер (и таким образом мо- жет стать родительским процессом), не должен перехваты- вать сигнал SIGCLD. [3] Сигнал SIGPOLL посылается, когда для дескриптора файла, соответствующего ПОТОКУ [см. intro(2)], ус- тановлена регистрация выборочных событий. Процесс должен специально запрашивать посылку этого сигна- ла посредством системного вызова ioctl с аргумен- том I_SETSIG, иначе сигнал SIGPOLL никогда не бу- дет получен. СМ. ТАКЖЕ intro(2), kill(2), pause(2), ptrace(2), wait(2), setjmp(3C), sigset(2). kill(1) в Справочнике пользователя. ДИАГНОСТИКА При успешном завершении системного вызова signal возв- ращается предыдущее значение func для указанного сигна- ла sig. В противном случае возвращается значение SIG_ERR, а переменной errno присваивается код ошибки. Значение SIG_ERR определено во включаемом файле . СЮРПРИЗЫ При попытке изменить стандартную реакцию на сигнал SIGKILL возвращается значение SIG_DFL (а не SIG_ERR, как должно быть), а переменная errno получает значение EINVAL.@