Книга: UNIX: взаимодействие процессов
Функция signal_rt
Разделы на этой странице:
Функция signal_rt
В книге [24, с. 120] мы привели пример собственной функции signal, вызывавшей функцию sigaction стандарта Posix для установки обработчика сигнала, обеспечивающего надежную семантику Posix. Изменим эту функцию, чтобы обеспечить поддержку реального времени. Новую функцию мы назовем signal_rt; ее текст приведен в листинге 5.15.
Листинг 5.15. Функция signal_rt с поддержкой реального времени
//lib/signal_rt.c
1 #include "unpipc.h"
2 Sigfunc_rt *
3 signal_rt(int signo, Sigfunc_rt *func)
4 {
5 struct sigaction act, oact;
6 act.sa_sigaction = func; /* сохраняем адрес функции */
7 sigemptyset(&act.sa_mask);
8 act.sa_flags = SA_SIGINFO; /* гарантирует режим реального времени */
9 if (signo == SIGALRM) {
10 #ifdef SA_INTERRUPT
11 act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
12 #endif
13 } else {
14 #ifdef SA_RESTART
15 act.sa_flags |= SA_RESTART; /* SVR4, 44BSD */
16 #endif
17 }
18 if (sigaction(signo, &act, &oact) < 0)
19 return((Sigfunc_rt *) SIG_ERR);
20 return(oact.sa_sigaction);
21 }
Упрощение прототипа функции с использованием typedef
1-3 В нашем заголовочном файле unpiрс.h (листинг В.1) мы определяем Sigfunc_rt как
typedef void Sigfunc_rt(int, siginfo_t*, void*);
Ранее в этом разделе мы говорили о том, что это прототип функции для обработчика сигнала, устанавливаемого с флагом SA_SIGINFO.
Указание функции-обработчика
Структура sigaction претерпела изменения с добавлением поддержки сигна-5-7 лов реального времени: к ней было добавлено новое поле sa_sigaction:
struct sigaction {
void (*sa_handler)(); /* SIG_DFL, SIG_IGN или адрес обработчика сигнала */
sigset_t sa_mask; /* дополнительные блокируемые сигналы */
int sa_flags; /* параметры сигналов: SA_XXX */
void (*sa_sigaction)(int, siginfo_t, void *);
};
Правила действуют следующие:
? Если в поле sa_flags установлен флаг SA_SIGINFO, поле sa_sigaction указывает адрес функции-обработчика сигнала.
? Если флаг SA_SIGINFO не установлен, поле sa_handler указывает адрес функции-обработчика сигнала.
? Чтобы сопоставить сигналу действие по умолчанию или игнорировать его, следует установить sa_handler равным либо SIG_DFL, либо SIG_IGN и не устанавливать флаг SA_SIGINFO.
Установка SA_SIGINFO
8-17 Мы всегда устанавливаем флаг SA_SIGINFO и указываем флаг SA_RESTART, если перехвачен какой-либо другой сигнал, кроме SIGALRM.
- 10.3. Стандартные сигналы С: signal() и raise()
- 10.3.1. Функция signal()
- Функция sem_wait
- Функция signal
- 10.6.4. Перехват сигналов: sigaction()
- Сигналы
- 10.3.2. Программная отправка сигналов: raise()
- 10.4.2. BSD и GNU
- Надежные сигналы
- Состояния дежурного ожидания
- Приложение В Таблица сигналов
- Ждущие блокировки