Server for Information Technologies Сервер поддерживается
Центром Информационных Технологий
(095) 932-9212, 932-9213, 939-0783
E-mail: info@citforum.ru
Сервер содержит море(!) аналитической информации CIT Forum CD-ROM

SIGSET(2)

НАЗВАНИЕ
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, и имеет уникальное значение, которое не соответствует ни одной определенной функции.

В любом другом случае 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 потерпит крах, если выполнится одно из следующих условий:

[EINVAL]
Сигнал sig имеет неверное значение (включая SIGKILL), или обработка sig по умолчанию не может быть изменена.
[EINTR]
Сигнал был получен во время системного вызова sigpause.

СМ. ТАКЖЕ
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), не следует использовать в соединении с приведенными функциями для обработки специфических типов сигналов.
Comments: info@citmgu.ru
Designed by Andrey Novikov
Copyright © CIT