[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Изменение сигнальной маски - Пример

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

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

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

Файл: 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        }