2011-08-16 3 views
1

POSIX sigaction 기능을 사용하여 신호를 학습하려고합니다.sigaction을 사용하여 POSIX 신호를 학습하십시오.

사용자가 입력하라는 메시지가 표시됩니다. 프롬프트 후에 5 초 알람이 설정됩니다. 알람이 만료되기 전에 사용자가 무언가를 입력하지 않으면 사용자는 다시 프롬프트됩니다. 사용자가 무언가를 입력하면 알람이 취소되고 입력이 다시 에코됩니다. 세 번째 재 입력 후에 입력이 없으면 프로그램이 종료됩니다.

아래는 내가 지금까지 가지고있는 것입니다. 이것은 입력이 없을 때 처음으로 프롬프트를 표시 한 후 "알람 신호"라는 메시지와 함께 종료됩니다.

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <errno.h> 
#include <time.h> 
#include <signal.h> 

volatile sig_atomic_t count = 0; 

void sighandler(int signo) 
{ 
    ++count; 
} 

int main(void) 
{ 
    char buf[10]; 
    struct sigaction act; 
    act.sa_handler = sighandler; 

    sigemptyset(&act.sa_mask); 

    act.sa_flags = 0; 

    if(sigaction(SIGINT, &act, 0) == -1) 
    { 
    perror("sigaction"); 
    } 

    while(count < 3) 
    { 
    printf("Input please: "); 

    alarm(5); 

    if(fgets(buf, 10, stdin)) 
    { 
     alarm(0); 
     printf("%s", buf); 
    } 
    } 

return 0; 
} 
+3

당신은'SIGINT'를 잡았지만 경보는'SIGALRM'을 사용합니다. – user786653

+0

고맙습니다, user786653. – user695752

답변

3

SIGINT 대신 SIGALRM 대신 처리기를 등록합니다. 따라서 알람이 도착하면 기본 처리에 따라 프로세스가 종료됩니다.

보조 메모로 select을 사용할 수도 있습니다.

+0

그리고이 코드에서 (그렇지 않으면 피할 수없는) 경쟁 조건을 피할 수 있기 때문에 당신은 이것을 위해'select'를 사용해야합니다. (시스템이 정말로 바빠서'alarm (5)'와'fgets'사이에 5 초 이상 걸리면 신호를 놓치고 'fgets'에서 영원히 차단 될 것입니다.) – Nemo

관련 문제