[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Переустановка реакции на сигнал - пример

Эта программа похожа на предыдущий пример, за исключением того, что
SIGINT может быть перехвачен много раз без завершения программы.
Каждый раз, когда SIGINT перехватывается, вызывается функция
обработки, которая печатает сообщение и возобновляет исполнение с того
места, где был перехвачен сигнал.
14-15     Устанавливается  реакция   на  сигналы   SIGINT  и  SIGQUIT.
          Сигнал SIGQUIT  генерируется символом  FS (клавиши CTRL и \,
          нажатые одновременно).  Заметьте, что реакция на оба сигнала
          - одна и та же функция.

29-38     Значение сигнала передается как аргумент функции sigcatch().
          При перехвате ядро сбрасывает реакцию на сигнал к реакции по
          умолчанию. Поэтому  функция обработки  начинает с  того  что
          требует ядро игнорировать сигналы того типа, который возник.
          Это предохраняет программу от завершения, если второй сигнал
          возникнет во  время вычисления  функции обработки.  Затем, в
          конце функции,  реакция на  сигнал снова переустанавливается
          на вызов  sigcatch(). Это  нужно  сделать  для  того,  чтобы
          перехватить сигнал снова.


Между перехватом сигнала и вызовом signal(2) с SIG_IGN в функции
обработки сигнала, существует небольшой интервал времени, в котором
вновь прибывший сигнал может завершить программу. Такая аномалия более
вероятна на сильно загруженной системе. Однако, сигналы SIGILL и
SIGTRAP не сбрасываются во время их перехвата.
Вы можете видеть из вывода программы, что каждый раз, когда нажимается
клавиша DELETE, вызывается функция обработки.
$ primes2
<DELETE>
111 primes computed
<DELETE>
132 primes computed
<DELETE>
147 primes computed
<DELETE>
177 primes computed
<DELETE>
203 primes computed
<CTRL \>
224 primes computed

Файл: primes2.c
               ПЕРЕУСТАНОВКА РЕАКЦИИ НА СИГНАЛ - ПРИМЕР
1   #include <stdio.h>
2   #include <signal.h>
3   #define   OUTPUT   "Primes"
4   #define   MAXNUM   10000
5   int count;
6   FILE *fptr;
7
8   main()
9   {
10      int number, divisor;
11      void sigcatch(int);
12
13      fptr = fopen(OUTPUT, "w");
14      signal(SIGINT, sigcatch);
15      signal(SIGQUIT, sigcatch);
   ...
25      fclose(fptr);
26   }
27
28
29   void sigcatch(int sig)
30   {
31      signal(sig, SIG_IGN);
32      printf("%d primes computed\n",count);
33      if (sig == SIGQUIT) {
34         fclose(fptr);
35         exit(1);
36      }
37      signal(sig, sigcatch);
38   }