Остановка до сигнала - Пример



 

Этот пример показывает, как останавливаться, ожидая прибытия сигнала, с использованием sigpause(2). В функции обработки сигнала внешняя переменная flag увеличивается на единицу. Перед проверкой flag вызывается sighold(2). Если flag равен нулю, не было перехвачено ни одного сигнала SIGINT, и программа засыпает в ожидании сигналов,

используя sigpause(2). Когда сигнал прибывает, программа просыпается и исполняет функцию обработки. Если сигнал прибудет до проверки flag, то sigpause() не будет вызвана. Наконец, переменная flag обнуляется, и задержанные сигналы освобождаются. Заметьте, что sigpause(2) автоматически освобождает заданный сигнал, если он прибыл, но был задержан.

 

Файл: sigpause1.c

               ОСТАНОВКА ДО СИГНАЛА - ПРИМЕР

 

 1 #include <signal.h>

 2

 3 int flag;

 4

 5 main()

 6 {

 7 void sigcatch();

 8

 9 sigset(SIGINT, sigcatch);

10 sigset(SIGQUIT, sigcatch);

11 while (1) {

12 /*

13 * processing here

14 */

15    sleep(3);

16

17    sighold(SIGINT);

18    if (flag == 0) {

19      printf("pausing for SIGINT\n");

20      sigpause(SIGINT);

21    }

22    flag = 0;

23    sigrelse(SIGINT);

24 }

25 }

26

27

28 void sigcatch(int sig)

29 {

30 printf("entering sigcatch()\n");

31 if (sig == SIGQUIT)

32   exit(1);

33 flag++;

34 }

 

Маска сигналов процесса

Сигнальная маска - объект типа sigset_t, содержимое которого представляет собой множество (битовую маску) сигналов, поддерживаемых данной реализацией.

Если бит, соответствующий номеру сигнала, установлен в маске, считается, что сигнал принадлежит множеству. Напротив, если бит сброшен, то считается, что сигнал не принадлежит множеству.

Первоначально, маска представляла собой целое число, но в стандарте POSIX было предложено описать её как непрозрачный тип, манипуляции над которым осуществляются только при помощи предоставленных библиотекой функций. Это облегчает перенос программ, работающих с масками сигналов, на платформы, поддерживающие различное количество типов сигналов. В 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 или системным вызовом до того, как применять к нему любые другие операции.

 

Манипуляции с сигнальной маской 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  }

 


Дата добавления: 2018-06-27; просмотров: 177; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!