2011-02-03 5 views
1

단일 프로세스에 여러 타이머를 등록하는 방법은 무엇입니까? 나는 다음의 코드를 시도했지만 성공하지는 못했다. ("gcc -lrt"를 사용하여 컴파일하십시오 ...). 프로그램 출력은 아무 것도 출력하지 않아야하는데, 적어도 "test"를 출력해야합니다. 그것은 아마도 rt에 연결하는 의존성 때문일까?하나의 프로세스에 여러 타이머 (rt에 연결하지 않고)

#define TT_SIGUSR1 (SIGRTMAX) 
#define TT_SIGUSR2 (SIGRTMAX - 1) 
#define TIME_INTERVAL_1 1 
#define TIME_INTERVAL_2 2 

#include <signal.h> 
#include <time.h> 

#include <stdio.h> 
#include <unistd.h> 
#include <linux/unistd.h> 
#include <sys/syscall.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <sched.h> 
#include <signal.h> 
#include <setjmp.h> 
#include <errno.h> 
#include <assert.h> 


timer_t create_timer(int signo) { 
    timer_t timerid; 
    struct sigevent se; 
    se.sigev_signo = signo; 
    if (timer_create(CLOCK_REALTIME, &se, &timerid) == -1) { 
     fprintf(stderr, "Failed to create timer\n"); 
     exit(-1); 
    } 
    return timerid; 
} 

void set_timer(timer_t timerid, int seconds) { 
    struct itimerspec timervals; 
    timervals.it_value.tv_sec = seconds; 
    timervals.it_value.tv_nsec = 0; 
    timervals.it_interval.tv_sec = seconds; 
    timervals.it_interval.tv_nsec = 0; 

    if (timer_settime(timerid, 0, &timervals, NULL) == -1) { 
     fprintf(stderr, "Failed to start timer\n"); 
     exit(-1); 
    } 
    return; 
} 

void install_sighandler2(int signo, void(*handler)(int)) { 
    struct sigaction sigact; 

    sigemptyset(&sigact.sa_mask); 
    sigact.sa_flags = SA_SIGINFO; 
    //register the Signal Handler 
    sigact.sa_sigaction = handler; 

    // Set up sigaction to catch signal first timer 
    if (sigaction(signo, &sigact, NULL) == -1) 

    { 
     printf("sigaction failed"); 
     return -1; 
    } 
} 

void install_sighandler(int signo, void(*handler)(int)) { 
    sigset_t set; 
    struct sigaction act; 

    /* Setup the handler */ 
    act.sa_handler = handler; 
    act.sa_flags = SA_RESTART; 
    sigaction(signo, &act, 0); 

    /* Unblock the signal */ 
    sigemptyset(&set); 
    sigaddset(&set, signo); 
    sigprocmask(SIG_UNBLOCK, &set, NULL); 

    return; 
} 


void signal_handler(int signo) { 
    printf("receiving sig %d", signo); 
} 

int main() 
{ 
    printf("test"); 
    timer_t timer1 = create_timer(TT_SIGUSR1); 
    timer_t timer2 = create_timer(TT_SIGUSR2); 

    set_timer(timer1, TIME_INTERVAL_1); 
    set_timer(timer2, TIME_INTERVAL_2); 

    install_sighandler2(TT_SIGUSR1, signal_handler); 
    install_sighandler(TT_SIGUSR2, signal_handler); 

    while (1) 
     ; 
    return 0; 
} 
+1

변경'의 printf ("테스트")는'있도록 디버그 메시지는 표준 출력 버퍼에 앉아하지 않습니다. –

+0

이제 테스트를 볼 수 있습니다. 아직, signal_handler의 출력은 없습니다. 나는 우분투에서 달리고있다. signal_handler의 출력을 볼 수 있는지 알려주세요. – Richard

답변

0
  • create_timer 누락 : se.sigev_notify=SIGEV_SIGNAL;
  • install_sighandler 방법. Install_sighandler2에는 불일치 포인터 유형에 대한 경고가 있습니다.
  • while (1) 귀하의 프로세서를 숙이고 잠을 것입니다. 의 printf ("테스트 \ n을")`에`;

#define TT_SIGUSR1 (SIGUSR1) 
#define TT_SIGUSR2 (SIGUSR2) 
#define TIME_INTERVAL_1 1 
#define TIME_INTERVAL_2 2 

#include <signal.h> 
#include <time.h> 

#include <stdio.h> 
#include <unistd.h> 
#include <linux/unistd.h> 
#include <sys/syscall.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <sched.h> 
#include <signal.h> 
#include <setjmp.h> 
#include <errno.h> 
#include <assert.h> 
#include <stdlib.h> 

timer_t create_timer(int signo) { 
    timer_t timerid; 
    struct sigevent se; 
    se.sigev_notify=SIGEV_SIGNAL; 
    se.sigev_signo = signo; 
    if (timer_create(CLOCK_REALTIME, &se, &timerid) == -1) { 
     perror("Failed to create timer"); 
     exit(-1); 
    } 
    return timerid; 
} 

void set_timer(timer_t timerid, int seconds) { 
    struct itimerspec timervals; 
    timervals.it_value.tv_sec = seconds; 
    timervals.it_value.tv_nsec = 0; 
    timervals.it_interval.tv_sec = seconds; 
    timervals.it_interval.tv_nsec = 0; 

    if (timer_settime(timerid, 0, &timervals, NULL) == -1) { 
     perror("Failed to start timer"); 
     exit(-1); 
    } 
    return; 
} 

void install_sighandler(int signo, void(*handler)(int)) { 
    sigset_t set; 
    struct sigaction act; 

    /* Setup the handler */ 
    act.sa_handler = handler; 
    act.sa_flags = SA_RESTART; 
    sigaction(signo, &act, 0); 

    /* Unblock the signal */ 
    sigemptyset(&set); 
    sigaddset(&set, signo); 
    sigprocmask(SIG_UNBLOCK, &set, NULL); 

    return; 
} 


void signal_handler(int signo) { 
    printf("receiving sig %d\n", signo); 
} 

int main() 
{ 
    printf("test\n"); 
    timer_t timer1 = create_timer(TT_SIGUSR1); 
    timer_t timer2 = create_timer(TT_SIGUSR2); 

    install_sighandler(TT_SIGUSR1, signal_handler); 
    install_sighandler(TT_SIGUSR2, signal_handler); 

    set_timer(timer1, TIME_INTERVAL_1); 
    set_timer(timer2, TIME_INTERVAL_2); 

    while (1) sleep(1); 
    return 0; 
} 

+0

페이지에 코드 예제를 추가 할 때 문제가 발생했습니다. 아마 내가 바보 인 희망 일 것임에 틀림 없다. –

관련 문제