2011-12-01 3 views
4

신호 처리 문제가 있습니다. SIGINT 신호를받는다면 "Recieved Signal"을 출력해야한다고 가정하십시오. 십초 내에 핸들러가 다른 신호를 접수에 경우, 나는이 같은 내 코드를 만든 다음 상태 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을 무시해야합니까?

+1

for 루프 내용을 'sleep (1);로 변경하여 다른 프로세스도 실행할 기회를 얻으십시오. –

답변

3

Windows 플랫폼을 사용하는 경우 SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV 또는 SIGTERM 신호 만 보낼 수 있습니다.

+0

OK, thx. 하지만 리눅스에서이 프로그램을 실행하면 작동해야합니다. 그렇지 않아야합니까? – user1075627

+0

@ user1075627 : 예, SIGALRM이'signal.h '에 정의되어 있기 때문에 컴파일은 리눅스 박스에서 작동해야합니다. –

1

당신은 쓰기 :이 코드가 맞다면

내가 알고 싶은 것은.

아니요. printf()는 async-signal-safe이 아니므로 안전하다고 확신하지 않는 한 시그널 핸들러 내에서 호출해서는 안됩니다. 당신이 제공하는 코드 내에서 이 아니고이 아니어도 안전합니다.

alarm() 기술은 일반적으로 경주하기 쉽습니다. secondhandler() 함수의 중간에 10 초 알람이 만료 될 수 있습니다. 이 문제를 방지하려면 a more sophisticated signal manipulation function으로 보완하기 위해 신호를 가릴 수 있습니다.

원하는 시간 제한을 구현하는 데 좀 더 우아하고 유연한 방법이 있지만 이는 아마도 codereview.stackexchange.com에 더 적합한 질문 일 것입니다.