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