Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. 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 
...

Предыдущий раздел: Оглавление Следующий раздел:
Модель ненадёжной обработки сигналов   Модель обработки сигналов реального времени