[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Освобождение сигнала - Пример

Этот  пример   иллюстрирует  использование   sigset(2)  для  перехвата
сигналов совместно  с longjmp(3),  используемой  в  функции  обработки
сигнала. Сигнал  должен быть освобожден вызовом sigrelse(2) перед тем,
как для  выхода из  функции обработки  будет вызван  longjmp(3). Иначе
сигнал будет  задержан  без  необходимости,  потому  что  ядро  делает
действия, эквивалентные  sighold(2) перед  вызовом  функции  обработки
сигнала, и эквивалентные sigrelse(2) после выхода из нее.

В этом  примере sigcatch()  всегда возвращает  управление в точку кода
перед входом  в цикл,  помеченную setjmp(3).  Дополнительный getchar()
отбрасывает символ перевода строки.

Файл: sigrelse.c
                    ОСВОБОЖДЕНИЕ СИГНАЛА - ПРИМЕР


 1     #include <signal.h>
 2     #include <setjmp.h>
 3     #define   MAXLINE   256
 4
 5     jmp_buf env;
 6
 7     main()
 8     {
 9     void sigcatch(int);
10     char line[MAXLINE];
11
12     sigset(SIGINT, sigcatch);
13     setjmp(env);
14
15     for (;;) {
16     printf("Prompt: ");
17     gets(line);
18     /*
19      * process the input here
20      */
21     }
22     }
23
24
25     void sigcatch(int sig)
26     {
27     int ch;
28
29     printf("\nDo you want to exit (y or n)? ");
30     ch = getchar();  getchar();
31     if (ch == 'y')
32     exit(1);
33     sigrelse(SIGINT);
34     longjmp(env, 1);
35     }