[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Обработка сигналов в SVR4 - маска сигналов процесса
В ОС UNIX System V Версия 4 были добавлены новые системные вызовы и
библиотечные функции, для того чтобы обеспечить более надежный
сигнальный интерфейс и совместимость с POSIX P1003.1. Наиболее
заметная особенность этих изменений - использование маски сигналов в
качестве параметра. Ядро поддерживает информацию о системных сигналах,
доставка которых процессу в данный момент заблокирована. Новые функции
работают с сигнальной маской ядра, содержащей эту информацию.
Сигнальная маска - объект типа sigset_t, содержимое которого
представляет собой битовую маску сигналов, поддерживаемых данной
реализацией. В SVR4 это массив из 4 unsigned long. Библиотечные
функции (sigsetops(3C)) используются для манипуляции с отдельными
битами в копии маски sigset_t, принадлежащей пользовательской
программе. Использование новых системных вызовов обычно включает в
себя создание копии маски, установку маски так, чтобы она отражала
сигналы, которые должны быть блокированы или разблокированы, и вызов
соответствующей системной функции изменения сигнальной маски ядра.
Руководство по sigsetops(2) содержит функции для манипуляций с
объектами типа sigset_t.
sigemptyset(3C)
Инициализирует маску сигналов, на которое указывает параметр set так,
чтобы исключить все сигналы, определенные в системе.
sigfillset(3C)
Инициализирует маску сигналов, на которое указывает параметр set так,
чтобы включить все сигналы, определенные в системе.
sigaddset(3C)
Добавляет индивидуальный сигнал, заданный значением signo, к маске, на
которую указывает set.
sigdelset(3C)
Удаляет индивидуальный сигнал, заданный значением signo, из маски, на
которую указывает set.
sigismember(3C)
Проверяет, установлен ли сигнал, заданный значением signo, в маске, на
которую указывает set.
Замечание: Объект типа sigset_t должен быть инициализирован вызовом
sigfillset или sigemptyset до того, как применять к нему любые другие
операции.
ОБРАБОТКА СИГНАЛОВ В SVR4 - МАСКА СИГНАЛОВ ПРОЦЕССА
sigsetops(3C)
ИМЯ
sigemptyset, sigfillset, sigaddset, sigdelset, sigismember -
манипуляции масками сигналов.
ИСПОЛЬЗОВАНИЕ
#include <signal.h>
int sigemptyset(sigset_t * set);
int sigfillset(sigset_t * set);
int sigaddset(sigset_t * set, int signo);
int sigdelset(sigset_t * set, int signo);
int sigismember(sigset_t * set, int signo);
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
успех - sigismember: 1 если истинно, 0 если ложно;
остальные функции: 0
неуспех - -1 и errno установлена
Манипуляции с сигнальной маской sigset_t - Пример
Эта программа использует функции sigsetops(3C) для манипуляций с
битами в маске объекта sigset_t, представляющего определенные сигналы.
Имейте в виду, эта программа не влияет на обработку сигналов
процессом. Она только работает с битами в пользовательской области
памяти.
6 Создать экземпляр объекта типа sigset_t.
9 Инициализировать переменную mask.
10-13 Установить в переменной mask биты, представляющие сигналы 1-
3 и 15-17.
15-16 Распечатать четыре элемента массива unsigned long, которые
образуют mask.
17-28 Для всех возможных сигналов выдать, установлен он или нет в
mask, а также можно ли вообще маскировать его.
Вывод этой программы выглядит так:
$ sigmsk
00000340007
00000000000
00000000000
00000000000
Signal 0 ILLEGAL Signal 1 Set Signal 2 Set
Signal 3 Set Signal 4 Not Set Signal 5 Not Set
Signal 6 Not Set Signal 7 Not Set Signal 8 Not Set
Signal 9 Not Set Signal 10 Not Set Signal 11 Not Set
Signal 12 Not Set Signal 13 Not Set Signal 14 Not Set
Signal 15 Set Signal 16 Set Signal 17 Set
Signal 18 Not Set Signal 19 Not Set Signal 20 Not Set
Signal 21 Not Set Signal 22 Not Set Signal 23 Not Set
Signal 24 Not Set Signal 25 Not Set Signal 26 Not Set
Signal 27 Not Set Signal 28 Not Set Signal 29 Not Set
Signal 30 Not Set Signal 31 Not Set Signal 32 ILLEGAL
Файл: sigmsk.c
МАНИПУЛЯЦИИ С СИГНАЛЬНОЙ МАСКОЙ sigset_t - ПРИМЕР
1 #include <stdio.h>
2 #include <signal.h>
3
4 main()
5 {
6 sigset_t mask;
7 int i;
8
9 sigemptyset(&mask);
10 for( i = SIGHUP; i <= SIGQUIT; i++)
11 sigaddset(&mask, i);
12 for( i = SIGTERM; i <= SIGUSR2; i++)
13 sigaddset(&mask, i);
14
15 for( i = 0; i < 4; i++)
16 printf("%011o\n", mask.sigbits[i]);
17 for(i = 0; i <= NSIG; i++) {
18 switch( sigismember( &mask, i) ) {
19 case -1 :
20 printf("Signal %2d ILLEGAL ", i);
21 break;
22 case 1 :
23 printf("Signal %2d Set ", i);
24 break;
25 case 0 :
26 printf("Signal %2d Not Set ", i);
27 break;
28 }
29 if( !((i + 1) % 3) ) putchar('\n');
30 }
31 putchar('\n');
32 }