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