НАЗВАНИЕ
sigset, sighold, sigignore, sigpause - процедуры управления
сигналами.
СИНТАКСИС
#include <signal.h> 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 задает реакцию системы на
сигнал sig. Эта реакция заключается либо в вызове обработчика сигнала
процесса func, либо в выполнении определенного системой действия.
Параметру sig может быть присвоено любое из приведенных значений, за исключением значения SIGKILL. Сигналы, зависящие от аппаратной или программной реализации, не приведены (см. "Примечания" ниже). Каждое значение sig является макросом, определенным в файле <signal.h> и который может быть представлен в виде выражения-константы.
SIGHUP | прекращение сетевой связи |
SIGINT | прерывание |
SIGQUIT* | выход |
SIGILL* | неверная инструкция (не удерживается при получении) |
SIGTRAP* | прерывание трассировки (не удерживается при получении) |
SIGABRT* | аварийный выход |
SIGFPE* | ошибка операции с плавающей точкой |
SIGKILL | уничтожение (не может быть получен или опущен) |
SIGSYS* | неверный аргумкент в системном вызове |
SIGPIPE | запись в канал конвейера без последующего чтения |
SIGALRM | сигнал тревоги |
SIGTERM | сигнал программного завершения |
SIGUSR1 | определенный пользователем сигнал 1 |
SIGUSR2 | определенный пользователем сигнал 2 |
SIGCLD | смерть дочернего процесса |
SIGPWR | сбой питания |
SIGPOLL | ожидание выбираемого события (см. "Примечания" ниже) |
В отношении звездочек (*) в вышеприведенном списке смотрите текст под SIG_DFL.
Следующие значения для определенных системой действий func также определяются в файле <signal.h>. Каждое из них является макросом, который может быть представлен в виде выражения-константы типа указателя на функцию, возвращающую void, и имеет уникальное значение, которое не соответствует ни одной определенной функции.
Эффективный пользовательский идентификатор и действительный пользовательский идентификатор получающего сигнал процесса совпадают.
Существует обычный файл с именем core, который доступен для записи, или этот файл может быть создан. Если он должен быть создан, тоон будет иметь следующие свойства:
В любом другом случае func должен быть указателем на функцию-обработчик, которая вызывается при возникновении сигнала sig. В этом случае sigset определяет, что процесс должен вызвать эту функцию по получении сигнала sig. Любой ожидаемый сигнал этого типа сбрасывается. Адрес данного обработчика поддерживается длявсех вызовов прочих функций управления сигналами, перечисленными здесь.
При возникновении сигнала его значение sig передается обработчику в качестве единственного аргумента. Перед вызовом обработчика реакция системы на сигнал устанавливается на SIG_HOLD. При нормальном возврате из обработчика реакция системы на сигнал восстанавливается на func, и любой ожидаемый сигнал этого типа сбрасывается.Если выполняется нелокальный переход goto(longjmp - дальний прыжок), тодля восстановления реакции системы на сигнал и сброса любого удерживаемого сигнала данного типа должен быть вызван sigrelse.
В принципе после возврата из обработчика сигнала процесс, получивший этот сигнал, должен возобновить свое выполнение в точке, где он был прерван. Однако, если сигнал ловится во время системных вызовов read(2), write(2), open(2) или ioctl(2), когда работает системный вызов sigpause или wait(2), которые задерживают возврат из-за наличия предварительно приостановленного процесса (или зомби-процесса), то будет выполняться обработчик сигнала, после чего прерванный системный вызов может возвратить вызывавшему процессу -1 со значением errno, установленным в EINTR.
sighold и sigrelse используются для установления критических областей кода. sighold соответствует поднятию уровня приоритета и удержанию сигнала, пока этот приоритет не будет снижен с помощью sigrelse. sigrelse восстанавливает реакцию системы на сигнал в предварительно заданную с помощью sigset.
sigignore устанавливает реакцию на сигнал sig в SIG_IGN (см. выше).
sigpause приостанавливает вызывающий процесс, пока он не получит сигнал; аналогично работает pause(2).Однако, при получениии удержании сигнала sig, он сбрасывается, и активизируется системная реакция на этот сигнал. Этот системный вызов полезен для проверки переменных, которые меняют свое значение при возникновении сигнала. При этом правильные действия таковы: вначале sighold используется для блокировки сигнала, затем проверяются переменные. Если онине изменились, то вызывается sigpause для ожидания сигнала. Вызов sigset потерпит крах, если выполнится одно из следующих условий:
СМ. ТАКЖЕ
kill(2), pause(2), signal(2), wait(2), setjmp(2)
ДИАГНОСТИКА
При успешном завершении sigset возвращает предыдущее значение
реакции системы на заданный сигнал sig. В противном случае
возвращается значение SIG_ERR, а errno указывает на ошибку.SIG_ERR
определяется в файле <signal.h>
Что касается других функций,то при их успешном выполнении возвращается значение 0. В противном случае возвращается значение -1, а errno указывает на ошибку.
Примечания
Сигнал SIGPOLL возникает, когда файловый дескриптор, соответствующий
файлу STREAMS [см. intro(2)], задает ожидание "выбираемого" события.
Для того, чтобы этот сигнал был послан, процесс должен сделать
специальный запрос с помощью вызова I_SETSIG ioctl(2). В противном
случае этот процесс никогда не получит сигнал SIGPOLL.
В целях компактности прикладные программы должны использовать только символические имена сигналов, а не их значения, и применять только те сигналы, которые перечислены здесь. Реакция на сигнал SIGKILL по умолчанию не может быть изменена.
Специальные разработки могут определять собственные сигналы, а обработчику сигналов могут быть переданы дополнительные определенные в разработке аргументы, соответствующие аппаратным сигналам. В случае некоторых аппаратно генерируемых сигналов может оказаться невозможным возобновление выполнения процессов в точке их прерывания.
Сигнальный тип SIGSEGV резервируется на случай некорректного доступа к информационному объекту. Если разрабатываемая программа в состоянии определить возникновение подобного состояния, то следует использовать этот сигнальный тип.
Другие функции управления сигналами, signal(2) и pause(2), не следует использовать в соединении с приведенными функциями для обработки специфических типов сигналов.