ВУЗ:
Составители:
24
if (old_action.sa_handler != SIG_IGN)
sigaction (SIGTERM, &new_action, NULL);
...
}
Функция sigemptyset будет описана позднее.
Значение аргумента sa_flags интерпретируется как битовая маска. Аргумент
может включать следующие флаги:
SA_NOCLDSTOP действует только для сигнала SIGCHLD. Если флаг установлен,
сигнал не посылается тем порожденным процессам, которые
остановлены.
SA_ONSTACK если флаг установлен, операционная система использует стек
для передачи сигнала. Если для процесса не определен стек, а
сигнал был сгенерирован, то процесс завершается с выработкой
сигнала ‘SIGILL’.
SA_RESTART Флаг контролирует действие, которое происходит, если
генерируется какой-либо сигнал в результате работы функции
(например, open, write, read) и обработчик сигнала выполнился
нормально. Если флаг установлен, по окончании выполнения
обработчика продолжает выполняться вызванная функция,
иначе выполнение функции прекращается.
Разработка обработчиков сигналов
Существуют две базовые стратегии, используемые при разработке функций-
обработчиков:
1. при поступлении сигнала функция выполняет некоторое действие и
возвращает управление в программу;
2. функция прерывает выполнение программы или исправляет ситуацию,
возникшую в результате ошибки.
Следует обратить особое внимание на то, что обработчик может быть вызван
асинхронно, из любой точки программы. При очень коротком интервале времени
выдачи сигнала два и более процессов обработчиков могут выполняться одновременно.
Обработчики первого типа используются для сигналов ‘SIGALRM’, сигналов,
поступающих от устройств ввода-вывода. Обработчик должен изменять некоторую
глобальную переменную в знак того, что обработчик получил управление. Тип данных
этой переменной должен быть sig_atomic_t.
Пример обработчика сигнала:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
volatile sig_atomic_t keep_going = 1;
void
catch_alarm (int sig)
{
keep_going = 0;
signal (sig, catch_alarm);
}
void
do_stuff (void)
{
puts ("Doing stuff while waiting for alarm....");
}
if (old_action.sa_handler != SIG_IGN)
sigaction (SIGTERM, &new_action, NULL);
...
}
Функция sigemptyset будет описана позднее.
Значение аргумента sa_flags интерпретируется как битовая маска. Аргумент
может включать следующие флаги:
SA_NOCLDSTOP действует только для сигнала SIGCHLD. Если флаг установлен,
сигнал не посылается тем порожденным процессам, которые
остановлены.
SA_ONSTACK если флаг установлен, операционная система использует стек
для передачи сигнала. Если для процесса не определен стек, а
сигнал был сгенерирован, то процесс завершается с выработкой
сигнала ‘SIGILL’.
SA_RESTART Флаг контролирует действие, которое происходит, если
генерируется какой-либо сигнал в результате работы функции
(например, open, write, read) и обработчик сигнала выполнился
нормально. Если флаг установлен, по окончании выполнения
обработчика продолжает выполняться вызванная функция,
иначе выполнение функции прекращается.
Разработка обработчиков сигналов
Существуют две базовые стратегии, используемые при разработке функций-
обработчиков:
1. при поступлении сигнала функция выполняет некоторое действие и
возвращает управление в программу;
2. функция прерывает выполнение программы или исправляет ситуацию,
возникшую в результате ошибки.
Следует обратить особое внимание на то, что обработчик может быть вызван
асинхронно, из любой точки программы. При очень коротком интервале времени
выдачи сигнала два и более процессов обработчиков могут выполняться одновременно.
Обработчики первого типа используются для сигналов ‘SIGALRM’, сигналов,
поступающих от устройств ввода-вывода. Обработчик должен изменять некоторую
глобальную переменную в знак того, что обработчик получил управление. Тип данных
этой переменной должен быть sig_atomic_t.
Пример обработчика сигнала:
#include
#include
#include
volatile sig_atomic_t keep_going = 1;
void
catch_alarm (int sig)
{
keep_going = 0;
signal (sig, catch_alarm);
}
void
do_stuff (void)
{
puts ("Doing stuff while waiting for alarm....");
}
24
Страницы
- « первая
- ‹ предыдущая
- …
- 22
- 23
- 24
- 25
- 26
- …
- следующая ›
- последняя »
