Библиотека сайта rus-linux.net
Цилюрик О.И. Linux-инструменты для Windows-программистов | ||
Назад | Библиотеки API POSIX | Вперед |
Модель надёжной обработки сигналов
Модель надёжной обработки сигналов на основе новой системы понятий:
1. Сигнальной маски типа: sigset_t
— по одному биту на каждый представляемый сигнал;
2. Набор функций заполнения/очистки сигнальной маски:
int sigemptyset( sigset_t* ); int sigfillset( sigset_t* ); int sigaddset( sigset_t*, int signo ); int sigdelset( sigset_t*, int signo ), ...
3. Маскирование реакции на сигнал:
int sigprocmask ( int how, const sigset_t* set, sigset_t* oset );
- где how
может быть:
SIG_BLOCK
— добавить сигналы к сигнальной маске процесса (заблокировать доставку);
SIG_UNBLOCK
— сбросить сигналы из сигнальной маски процесса (разблокировать доставку);
SIG_SETMASK
— установить как сигнальную маску процесса;
set
и oset
— устанавливаемая и ранее установленная (для сохранения) маска процесса.
4. Структура описывающая диспозицию сигнала:
struct sigaction { union { /* Signal handler. */ void (*sa_handler) ( int ) { /* Used if SA_SIGINFO is not set. */ void (*sa_sigaction) ( int, siginfo_t*, void*); /* Used if SA_SIGINFO is set. */ } sigset_t sa_mask; /* Additional set of signals to be blocked. */ int sa_flags; /* Special flags. */ ... };
Маска sa_mask
содержит сигналя, которые будут автоматически заблокированы в
обработчике сигнала.
Возможные значения поля флагов:
SA_RESETHANG
— после срабатывания обработчика сигнала будет восстановлен
обработчик по умолчанию (SIG_DFL
, что соответствует духу ненадёжной модели и позволяет
воспроизвести её поведение);
SA_NOCLDSTOP
— используется только для сигнала SIGCHLD
и указывает системе не генерировать для родительского процесса SIGCHLD
если
дочерний процесс завершается по SIGSTOP
;
SA_SIGINFO
— будет организована очередь доставки сигналов (модель сигналов
реального времени), при этом обработчику будет доставляться
дополнительная информация о сигнале — структура siginfo_t
и дополнительные параметры пользователя (при этом используется другой
прототип обработчика sa_sigaction
);
5. Функция установки диспозиции:
/* Get and/or set the action for signal SIG. */
extern int sigaction( int signo, const struct sigaction* act, struct sigaction* oact );
где: act
и oact
— новая устанавливаемая, и прежняя ранее
установленная (для сохранения) диспозиции, соответсвенно.
s8.cc : #include "head.h" void catchint( int signo ) { cout << "SIGINT: signo = " << signo << endl; }; int main() { static struct sigaction act = { &catchint, 0, 0 }; /* 0 = (sigset_t)NULL }; */ sigfillset( &(act.sa_mask) ); sigaction( SIGINT, &act, NULL ); for( int i = 0; i < 20; i++ ) sleep( 1 ), cout << "Cycle # " << i << endl; }; $ ./s8 Cycle # 0 ^CSIGINT: signo = 2 Cycle # 1 ^CSIGINT: signo = 2 Cycle # 2 ^CSIGINT: signo = 2 Cycle # 3 ^CSIGINT: signo = 2 Cycle # 4 ^CSIGINT: signo = 2 Cycle # 5 ^CSIGINT: signo = 2 Cycle # 6 Cycle # 7 ...
Предыдущий раздел: | Оглавление | Следующий раздел: |
Модель ненадёжной обработки сигналов | Модель обработки сигналов реального времени |