Простейшим интерфейсом к сигналам UNIX является устаревшая, но по-прежнему поддерживаемая в большинстве систем функция
#include
void(*signal(int sig, void (*disp)(int)))(int);
Аргумент sig
определяет сигнал, диспозицию которого нужно изменить.
Аргумент disp
определяет новую диспозицию сигнала, которой может быть определенная пользователем функция-обработчик или одно из следующих значений:
SIG_DFL | Указывает ядру, что при получении процессом сигнала необходимо вызвать системный обработчик, т.е. выполнить действие по умолчанию. |
SIG_IGN | Указывает, что сигнал следует игнорировать. Напомним, что не все сигналы можно игнорировать. |
В случае успешного завершения SIG
_DFL или SIG_IGN
. Возвращаемое значение может быть использовано для восстановления диспозиции в случае необходимости.
Использование функции
#include
/* Функция-обработчик сигнала */
static void sig_hndlr(int signo) {
/* Восстановим диспозицию */
signal(SIGINT, sig_hndlr);
printf("Получен сигнал SIGINT\n");
}
main() {
/* Установим диспозицию */
signal(SIGINT, sih_hndlr);
signal(SIGUSR1, SIG_DFL);
signal(SIGUSR2, SIG_IGN);
/* Бесконечный цикл */
while(1)
pause();
}
В этом примере изменена диспозиция трех сигналов: SIGINT
, SIGUSR1
и SIGUSR2
. При получении сигнала SIGINT
вызывается обработчик при получении сигнала SIGUSR1
производится действие по умолчанию (процесс завершает работу), а сигнал SIGUSR2
игнорируется. После установки диспозиции сигналов процесс запускает бесконечный цикл, в процессе которого вызывается функция EINTR
. Заметим, что каждый раз при получении сигнала SIGINT
мы вынуждены восстанавливать требуемую диспозицию, в противном случае получение следующего сигнала этого типа вызвало бы завершение выполнения процесса (действие по умолчанию).
При запуске программы, получим следующий результат:
$ а.out &
[1] 8365
PID порожденного процесса
$ kill -SIGINT 8365
Получен сигнал SIGINT
Сигнал SIGINT перехвачен
$ kill -SIGUSR2 8365
Сигнал SIGUSR2 игнорируется
$ kill -SIGUSR1 8365
[1]+ User Signal 1
Сигнал SIGUSR1 вызывает завер-
a.out
шение выполнения процесса
$
Для отправления сигналов процессу использована команда
Надежные сигналы
Стандарт POSIX. 1 определил новый набор функций управления сигналами. основанный на интерфейсе 4.2BSD UNIX и лишенный рассмотренных выше недостатков.
Модель сигналов, предложенная POSIX, основана на понятии sigset_t
. Каждый бит этой переменной отвечает за один сигнал. Во многих системах тип sigset_t
имеет длину 32 бита, ограничивая количество возможных сигналов числом 32.
Следующие функции позволяют управлять наборами сигналов:
#include
int sigempyset(sigset_t *set);
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии