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