Системное программное обеспечение - Учебное пособие (Терехин А.Н.)

4.3       использование надежных сигналов.

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

#include <signal.h>

#include <stdlib.h>

#include <stdio.h>

 

int count = 1;

struct sigaction action, sa;

 

void SigHandler(int s)

{

printf(" I got SIGINT \%d time(s) ", count++);

if (count == 5)

{

action.sa_handler = SIG_DFL;

/* изменяем указатель на функцию-обработчик сигнала */

sigaction(SIGINT, &action, &sa);

/* изменяем обработчик для сигнала SIGINT */

}

}

 

int main(int argc, char **argv)

{

          sigset_t sigset;

sigemptyset(&sigset); /* инициализируем набор сигналов */

sigaddset(&sigset, SIGINT); /*добавляем в набор сигналов бит, соответствующий сигналу SIGINT*/

if (sigprocmask(SIG_UNBLOCK, &sigset, NULL) == -1)

/*устанавливаем новую сигнальную маску*/

{

          printf(“sigprocmask() error ”);

          return -1;

}

action.sa_handler = SigHandler;

/* инициализируем указатель на функцию-обработчик сигнала*/

sigaction(SIGINT, &action, &sa);

/* изменяем обработчик по умолчанию для сигнала SIGINT */

while(1); /* бесконечный цикл */

return 0;

}