Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 24 стр.

UptoLike

Составители: 

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