[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Получение сигнала

Сигнал обрабатывается самим получающим процессом; другой процесс
посылает сигнал получающему процессу или процессам. Если не указано
иное, процесс выполняет при получении сигнала реакцию по умолчанию.
Реакция по умолчанию (SIG_DFL) для каждого сигнала указана на
предыдущей странице. Четыре возможности реакции по умолчанию:
exit      получающий процесс  завершается, как  если бы  была  вызвана
          exit(2).

core      получающий процесс  завершается, как  если бы  была  вызвана
          exit(2). Кроме  того, в текущей рабочей директории создается
          "образ ядра".

stop      получающий процесс останавливается.

ignore    получающий процесс  игнорирует этот  сигнал.  Это  идентично
          установке реакции в SIG_IGN.

Если реакция на сигнал установлена в SIG_IGN, полученный сигнал
игнорируется. Если реакция на сигнал является адресом функции, при
получении сигнала процесс исполнит функцию обработки по этому адресу.
Когда функция обработки сигнала завершается, получающий процесс
возобновляет исполнение с того места, где он был прерван, если функция
обработки не сделала других распоряжений.
Для signal(2), когда сигнал перехвачен, ядро сбрасывает реакцию на
этот сигнала в SIG_DFL перед входом в функцию обработки сигнала. Есть
очень маленькая вероятность, что второй сигнал того же типа возникнет
до явной переустановки реакции на этот сигнал, таким образом вызывая
ненормальное завершение процесса. Реакция на этот сигнал должна быть
явным образом переустановлена другим вызовом signal(2). Для sigset(2),
однако, этот сигнал задерживается пока программа не завершит функцию
обработки. Это будет детально обсуждаться ниже.
Реакции на сигналов SIGKILL и SIGSTOP не могут быть изменены.
Когда процесс получает сигналы SIGSTOP, SIGTSTP, SIGTTIN или SIGTTOU,
независимо от реакции на них, ожидающий сигнал SIGCONT будет отменен.
Когда процесс получает сигнал SIGCONT, независимо от реакции на него,
все ожидающие сигналы SIGSTOP, SIGTSTP, SIGTTIN или SIGTTOU будут
отменены. Кроме того, если процесс был остановлен, он продолжит
исполнение.
                          ПОЛУЧЕНИЕ СИГНАЛА
.    получающим процессом выполняются действия по обработке сигнала
.    возможные реакции:

          SIG_DFL        реакция по умолчанию
          SIG_IGN        проигнорировать сигнал
          адрес функции  перехватить сигнал

.    signal(2) сбрасывает реакцию в SIG_DFL при вызове обрабатывающей
функции
.    sigset(2) задерживает последующие сигналы на время исполнения
обрабатывающей функции
.    тип сигнала передается обрабатывающей функции

                              signal(2)
                     Установка реакции на сигнал

Системные  вызовы  signal(2)  и  sigset(2)  устанавливают  реакцию  на
сигнал, т.е.  действия, которые  процесс предпринимает, когда получает
заданный сигнал. Аргументы:

sig  задает номер сигнала - любой кроме SIGKILL или SIGSTOP.

disp задает реакцию и может принимать одно из значений:

.    SIG_DFL - при получении сигнала sig выполняется реакция по
умолчанию.
.    SIG_IGN - сигнал sig игнорируется.
.    адрес функции - При получении сигнала процесс вызывает заданную
функцию. Значение sig передается этой функции как аргумент. Это
называется перехватом (catching) сигнала. Пример значения указателя на
функцию - имя функции.
При использовании signal(2), после перехвата сигнала, реакция на этот
сигнала сбрасывается к реакции по умолчанию. Если вы хотите снова
перехватывать этот сигнал, вы должны опять переустановить реакцию на
вашу функцию обработки. Удобное место для этого - сама эта функция.
При использовании sigset(2), ядро задерживает новые сигналы до момента
возврата из функции обработки. После этого реакция на сигнал снова
устанавливается ядром в то же значение, которое было установлено
вызовом sigset(2). Если в это время был задержан еще один сигнал,
опять вызовется функция обработки.
Вы можете задать различные реакции для каждого сигнала. Но можно и
одну функцию использовать для обработки различных сигналов.
Значение, возвращаемое signal(2) - предыдущая установка реакции. Вы
можете использовать это значение для того, чтобы изменить реакцию; вы
можете также сохранить это значение и затем восстановить реакцию
такой, какой она была изначально.
Перехват сигналов прерывает некоторые системные вызовы, такие как
wait(2) или read(2) с медленного символьного устройства, (например,
терминала), заставляя вызов возвратить -1 как индикацию неуспеха.
Однако, при чтении с медленного символьного устройства данные не
теряются, если программа выполнит повторный read(2). Если wait(2) был
сброшен перехватом сигнала, он должен быть вызван снова, чтобы
дождаться оставшихся порожденных процессов. SVR4.0 предоставляет
возможность автоматического перезапуска системных вызовов, сброшенных
из-за перехвата сигнала. Это будет обсуждаться, когда пойдет речь о
sigaction(2).
При выполнении  exec(2) сигналы, реакция на которые была установлена в
указатель  на  функцию,  сбрасываются  в  SIG_DFL,  в  то  время,  как
игнорировавшиеся игнорируются и далее.
                     УСТАНОВКА РЕАКЦИИ НА СИГНАЛ

signal(2)

ИМЕНА

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

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

    #include <signal.h>

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

    int sighold(int sig);
    int sigrelse(int sig);
    int sigignore(int sig);
    int sigpause(int sig);

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

signal     успех - предыдущая реакция на сигнал неуспех - SIG_ERR и
           errno установлена

sigset успех - SIG_HOLD если сигнал заблокирован, иначе предыдущая
           реакция на этот сигнал
           неуспех - SIG_ERR и errno установлена

другие     успех - 0
           неуспех - -1 и errno установлено