[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Воздействие сигнала на ввод
Этот пример показывает результат получения сигнала во время чтения с
терминала.
12-13 Если сигнал игнорировался, то действие по прежнему
будет состоять в игнорировании сигнала. Это важно, потому
что вы можете исполнить эту программу в фоновом режиме,
когда сигнал SIGINT игнорируется.
14-24 Этот цикл читает строки со стандартного ввода и пишет
их на стандартный вывод.
14-19 Если read(2) завершается неудачно из-за получения
сигнала, исполнение продолжается с начала цикла. Иначе цикл
завершается, потому что достигнут настоящий конец файла.
Ниже показано, как работает этот пример: сначала в фоновом режиме
запускается команда посылки сигнала SIGINT (сигнал номер 2) всем
процессам в группе, управляемой TTY.
Замечание: Интерпретатор shell получает сигнал прерывания, но
игнорирует его. Кроме того, SIGINT генерируется нажатием <DELETE> на
клавиатуре.
Затем, сигнал прибывает во время печатания букв X. Эти буквы должны
быть прочитаны строкой 18 программы. Заметьте, что ввод из-за сигнала
не теряется.
$ sh
$ (sleep 5; kill -2 0) &
19952
$ input
XXXXXsignal 2 received
XX
n: 8
XXXXXXX
<CTRL d>
Файл: input.c
ВОЗДЕЙСТВИЕ СИГНАЛА НА ВВОД
1 #include <stdio.h>
2 #include <signal.h>
3 #include <errno.h>
4 #include <stdlib.h>
5
6 main()
7 {
8 void sigcatch(int);
9 char buf[BUFSIZ];
10 int n;
11
12 signal(SIGINT, sigcatch);
13
14 for (;;) {
15 if ((n = read(0, buf, BUFSIZ)) <= 0) {
16 if (errno == EINTR) {
17 errno = 0;
18 continue;
19 }
20 break;
21 }
22 printf("n: %d\n", n);
23 write(1, buf, n);
24 }
25 exit(0);
26 }
27
28 void sigcatch(int sig)
29 {
30 signal(SIGINT, SIG_IGN);
31 printf("signal %d received\n", sig);
32 signal(SIGINT, sigcatch);
33 }