Обработка нескольких сигналов - PullRequest
4 голосов
/ 01 декабря 2011

У меня вопрос по поводу обработки сигнала. Предположим, что если мы получаем сигнал SIGINT, мы должны напечатать «Полученный сигнал». Если в течение десяти секунд обработчик получает другой сигнал, он должен напечатать «Выключение», а затем выйти со статусом 1.

Я сделал свой код так:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void  handler(int);
void  secondhandler(int);
void  alrmhandler(int);

void alrmhandler (int alrmsig)
{  
  alarm(0);     
}

void secondhandler(int sig)
{
 /* after recieving second signal prints shutting down and exit */
 printf("Shutting Down\n");
 exit(1);
}

void handler ( int sig )  
{  
   /* recieve first SIGINT signal */
   printf ("Recieved Signal\n");
   /* handle for the alarm function */
   signal(SIGALRM, alrmhandler);
   /* start 10s alarm */
    alarm(10);
   /* catch second SIGINT signal within 10s*/
   signal(SIGINT, secondhandler);

 }



 int main( void )
 {
  signal(SIGINT, handler);
      printf( "Hello World!\n" );
  for ( ;; )
  {
    /* infinite loop */
  }

  return 0;
 }

Я пытался скомпилировать его с помощью dev c ++, но это не удалось. Поскольку SIGALRM необъявлен (первое использование в этой функции).

В любом случае, я хочу знать, верен ли этот код. Я на самом деле вроде не уверен с alrmhandler (). я должен игнорировать SIGALRM?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Если вы работаете на платформе Windows, вы можете отправлять только сигналы: SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV или SIGTERM.

1 голос
/ 03 мая 2013

Вы пишете:

я хочу знать, правильный ли этот код.

Не совсем,printf () не async-signal-safe , и поэтому не должен вызываться из обработчика сигнала, если вы не уверены, что это безопасно. не безопасно делать в коде, который вы предоставляете.

Техника alarm (), как правило, склонна к гонкам.Ваш десятисекундный сигнал тревоги может истечь в середине функции secondhandler ().Чтобы защититься от этого, вы можете замаскировать сигналы, чтобы компенсировать более сложной функцией обработки сигналов .

Существуют более элегантные / гибкие способы реализации желаемого времени ожидания, но, возможно, этовопрос лучше подходит для codereview.stackexchange.com .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...