Библиотека сайта 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
...
| Предыдущий раздел: | Оглавление | Следующий раздел: |
| Модель ненадёжной обработки сигналов | Модель обработки сигналов реального времени |
