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

Программа в этом примере вычисляет простые числа от 1 до MAXNUM. Эта
программа требует много времени для выполнения. Вы можете убить эту
программу в любой момент нажатием клавиши DELETE. Вместо того, чтобы
просто завершиться, программа перехватывает SIGINT и исполняет
функцию, которая показывает количество вычисленных к данному моменту
простых чисел, закрывает выходной файл и завершается.
12        Функция обработки  сигнала  объявлена,  потому  что  ее  имя
          будет использовано системным вызовом signal(2).

15        Вызывается signal(2),  теперь при  получении сигнала  SIGINT
          будет вызвана  функция sigcatch(). Заметьте, что если сигнал
          никогда  не  будет  получен,  sigcatch()  никогда  не  будет
          вызвана.

...       Полный листинг  программы приведен  в  конце  раздела.  Код,
          который  не   показан,   выполняет   собственно   вычисление
          простых   чисел.

29-34     Эта функция  обработки сигнала  будет вызвана,  когда  будет
          перехвачен  сигнал   SIGINT.  Функция   выводит   сообщение,
          закрывает выходной файл и завершает программу.

Если бы exit(2) не был вызван в функции обработки сигнала, исполнение
возобновилось бы с того места, где оно остановилось внутри main(2).
Однако, второй полученный SIGINT прервал бы эту программу, потому что
реакция на сигнал была бы установлена ядром в SIG_DFL.

Файл:     primes1.c
                      ПЕРЕХВАТ СИГНАЛА - ПРИМЕР


1   #include <stdio.h>
2   #include <signal.h>
3   #define   OUTPUT   "Primes"
4   #define   MAXNUM   10000
5
6   int count;
7   FILE *fptr;
8
9   main()
10  {
11  int number, divisor;
12  void sigcatch();
13
14  fptr = fopen(OUTPUT, "w");
15  signal(SIGINT, sigcatch);
   ...
25  fclose(fptr);
26  }
27
28
29  void sigcatch()
30  {
31  printf("%d primes computed\n", count);
32  fclose(fptr);
33  exit(1);
34  }