[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Управление сигналами

В ОС  UNIX System  V Версия  3 были введены новые системные вызовы для
управления сигналами,  которые лучше поддерживают сигналы и исправляют
некоторые из недостатков системного вызова signal(2). В частности, при
перехвате сигнала, реакция на который установлена с помощью signal(2),
ядро сбрасывает  реакцию на  него в  реакцию  по умолчанию. Прежде чем
реакция на  сигнал  будет  установлена  в  требуемое  значение,  вновь
возникший сигнал того же типа может убить процесс.

При перехвате  сигналов с  использованием sigset(2)  эта  проблема  не
возникает. При  получении  сигнала  ядро  автоматически  устанавливает
задержку таких сигналов до возврата из функции обработки. После этого,
реакция устанавливается  ядром на то значение, которое было изначально
задано вызовом  sigset(2). Если  в промежутке  был задержан сигнал, он
освобождается, и функция обработки вызывается снова тем же образом.

Руководство  по   signal(2)  содержит   набор  вызовов,   связанных  с
сигналами, которые  обсуждались выше.  Некоторые из  них предоставлены
для удобства.

sigset(2)

Системный вызов  sigset(2) имеет  такие же  параметры, как  signal(2).
Реакции, которые  могут  быть  заданы  для  сигнала  при  помощи  этой
функции, таковы:
  SIG_DFL -  Установить реакцию  на сигнал в реакцию по умолчанию. Как
     правило, эта реакция состоит в завершении программы.

  SIG_IGN - Игнорировать сигнал.

  SIG_HOLD -  Задерживать сигналы  при их  прибытии.  Ранее  ожидавшие
     сигналы остаются задержанными.

func - При возникновении сигнала вызывается функция, на которую
указывает func. Может быть использовано имя функции обработки. Когда
sigset вызывается с таким аргументом, задержанные сигналы
освобождаются.
sighold(2)

После вызова  sighold(2) вновь прибывающие сигналы задерживаются. Этот
вызов  эквивалентен   вызову  sigset(2)   с  реакцией  SIG_HOLD.  Этот
системный вызов предоставлен для удобства.

sigrelse(2)
sigrelse(2) освобождает  задержанные сигналы.  После этого выполняются
действия, заданные sigset(2).

sigignore(2)

Этот системный вызов эквивалентен вызову sigset(2) с реакцией SIG_IGN.
Этот системный вызов предоставлен для удобства.

sigpause(2)

Системный  вызов   sigpause(2)  делает   то  же   самое,   что   вызов
sigrelse(sig) и pause(2).
                         УПРАВЛЕНИЕ СИГНАЛАМИ


signal(2)

ИМЯ

      signal, sigset, sighold, sigrelse, sigignore, sigpause -
      упрощенное управление сигналами



ИСПОЛЬЗОВАНИЕ

 #include <signal.h>

  . . .

 void (*sigset (int sig, void (*disp)(int)))(int);

 sighold (int sig);

 sigrelse (int sig);

 int sigignore (int sig);

 int sigpause (int sig);


ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

      успех -  sigset: предыдущая установка реакции
                    на сигнал;
               остальные функции: 0

      неуспех - sigset: SIG_ERR и errno установлена;
               остальные функции: -1 и errno установлена