[<<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       }