Изменение или исследование маски сигналов процесса



Маска сигналов — это атрибут, хранящийся в пользовательской области процесса и представляющий собой множество заблокированных сигналов. Сигналы, упомянутые в маске, называются также замаскированными (masked). Такие сигналы не игнорируются, но и не доставляются процессу, до того момента, пока не будут разблокированы. В действительности, вызов sigset(2) с параметром SIG_HOLD и вызов sighold(2) реализованы как включение сигнала в маску, а sigrelse(2) — как исключение сигнала из маски.

Маска сигналов наследуется при fork(2) и exec(2).

Системный вызов sigprocmask(2) используется, чтобы изменить текущую маску сигналов процесса, определяющую сигналы, доставка которых в данный момент заблокирована. Кроме того, он может быть использован для исследования этой маски без произведения изменений в ней. Первый аргумент how принимает такие значения:

SIG_BLOCK - Множество сигналов, на которое указывает set, будет добавлено к текущей маске сигнала.

SIG_UNBLOCK - Множество set будет удалено из текущей маски.

SIG_SETMASK - Текущая маска будет заменена на set.

Если oset ненулевой, предыдущая сигнальная маска будет помещена в область памяти, на которую он указывает. sigprocmask(2) может быть использован для исследования текущей маски, если второй аргумент равен 0. В этом случае, how игнорируется, и текущая сигнальная маска вызывающего процесса остается без изменений.

sigpending(2)

Системный вызов sigpending(2) позволяет процессу посмотреть, какие сигналы были посланы, но в данный момент заблокированы сигнальной маской процесса.

 

Изменение сигнальной маски - Пример

 

Эта программа - вариант программы блокировки клавиатуры терминала, представленной в разделе «Терминальный ввод-вывод». В той версии, программа вызывала функции termios(2), чтобы выключить посылку сигналов, генерируемых терминалом, в терминальном драйвере. В этой альтернативной программе, вызовом sigprocmask(2) маска сигналов процесса устанавливается таким образом, чтобы единственным незаблокированным сигналом был сигнал разрыва линии SIGHUP.

11 Объявляется область памяти для сохранения копии сигнальной маски.

13-15  Все сигналы, кроме SIGHUP, блокируются

Восстанавливать маску сигналов не нужно, так как маска сигналов родительского процесса (например, shell) не менялась.

 

Файл: termlock.c


            ИЗМЕНЕНИЕ СИГНАЛЬНОЙ МАСКИ - ПРИМЕР

 

 

 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <signal.h>

 4 #include <sys/termios.h>

 5 #include <sys/types.h>

 6 main()     /* lock the terminal */

 7 {

 8 struct termios tty;

 9 tcflag_t savflags;

10 char key[BUFSIZ], *getkey(void);

11 sigset_t mask;

12

13 sigfillset(&mask);

14 sigdelset(&mask, SIGHUP);

15 sigprocmask(SIG_SETMASK, &mask, NULL);

16

17 tcgetattr(fileno(stdin), &tty);

18 savflags = tty.c_lflag;

19 tty.c_lflag &= ~ECHO;

20 tcsetattr(fileno(stdin), TCSANOW, &tty);

21 strcpy(key, getkey());

22 for (;;)

23 if (strcmp(key, getkey()) == 0){

24   tty.c_lflag = savflags;

25   tcsetattr(fileno(stdin), TCSANOW, &tty);

26   break;

27 }

28 }

29

30 char *getkey(void)    /* prompt user for key */

31 {

32 static char line[BUFSIZ];

33

34 fputs("Key: ", stderr);

35 line[0] = '\377';  /* impossible char */

36 fgets(line, BUFSIZ, stdin);

37 fputs("\n", stderr);

38 return(line);

39 }


Новые методы управления сигналами

Системный вызов sigaction(2) дает ранее недоступный уровень управления сигналами. Кроме того, он совместим с требованиями стандарта POSIX. sigaction(2) предоставляет возможности, ранее реализованные в sigset(2): закрывает окно уязвимости при использовании signal(2) и автоматически блокирует рекурсивный вызов функции обработки сигнала.

Параметры act и oact, если они не равны нулю, указывают на экземпляры struct sigaction со следующими полями:

 void (*sa_handler)(); - Адрес функции обработки сигнала, SIG_IGN или SIG_DFL

sigset_t sa_mask - Маска сигналов, которые должны быть заблокированы, когда вызывается функция обработки сигнала.

 int sa_flags - Флаги, управляющие доставкой сигнала.

Если аргумент act ненулевой, он указывает на структуру, определяющую новые действия, которые должны быть предприняты при получении сигнала sig. Если аргумент oact ненулевой, он указывает на структуру, где сохраняются ранее установленные действия для этого сигнала.

Поле sa_flags в struct sigaction формируется побитовым ИЛИ следующих значений:

 SA_ONSTACK - Используется для обработки сигналов на альтернативном сигнальном стеке.

 SA_RESETHAND - Во время исполнения функции обработки сбрасывает реакцию на сигнал к SIG_DFL; обрабатываемый сигнал при этом не блокируется. Этот флаг воспроизводит поведение signal(2).

 SA_NODEFER - Во время обработки сигнала сигнал не блокируется.

 SA_RESTART - Системные вызовы, которые будут прерваны исполнением функции обработки, автоматически перезапускаются.

 SA_SIGINFO - Используется для обработки надёжных сигналов и передачи обработчику дополнительных параметров. В этом курсе подробно не рассматривается.

 


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

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






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