2014-02-12 38 views
0

我有我想用來處理不同信號的代碼。我不知道爲什麼它永遠不會去timer_handler2()。它只是堅持timer_handler()。有人可以告訴我我做錯了什麼不使用多個信號處理程序的代碼

#include <stdio.h> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/time.h> 
#include <string.h> 

struct timeval theTime; 
static int count = 0; 

void timer_handler2(int signum) { 
    printf("timer 2 expired %d times\n", ++count); 
} 

void timer_handler(int signum) {  
    printf("timer 1 expired %d times\n", ++count); 
} 

void timer_handler3(int signum) { 

    printf("timer 3 expired %d times\n", ++count); 
} 

int main() { 
    struct itimerval timer, timer2, timer3, got;  

    signal(SIGVTALRM, timer_handler2); 
    signal(SIGALRM, timer_handler); 
    signal(SIGPROF, timer_handler3); 

    /* ... and every 1000 msec after that. */ 
    timer2.it_interval.tv_sec = 1; 
    timer2.it_interval.tv_usec = 0; 
    /* Configure the timer to expire after 1000 msec... */ 
    timer2.it_value.tv_sec = 1; 
    timer2.it_value.tv_usec = 0; 

    /* ... and every 1000 msec after that. */ 
    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_usec = 0; 
    /* Configure the timer to expire after 1000 msec... */ 
    timer.it_value.tv_sec = 1; 
    timer.it_value.tv_usec = 250000; 

    /* ... and every 1000 msec after that. */ 
    timer3.it_interval.tv_sec = 1; 
    timer3.it_interval.tv_usec = 0; 
    /* Configure the timer to expire after 1000 msec... */ 
    timer3.it_value.tv_sec = 1; 
    timer3.it_value.tv_usec = 0; 

    /* Start a real timer. It counts down whenever this process is 
    executing. */ 
    setitimer(ITIMER_VIRTUAL, &timer2, NULL); 
    setitimer(ITIMER_REAL, &timer, NULL); 
    setitimer(ITIMER_PROF, &timer3, NULL); 

    int counter = 0; 
    while (1) { 
     sleep(1); 
     counter++; 
    } 

    return 0; 
} 
+0

代碼太多!你能製作一個更簡單的例子嗎? –

+0

@OliCharlesworth我減少了代碼 –

+0

Cool。現在閱讀起來更容易!謝謝。 –

回答

0

你讓程序運行多久了? ITIMER_VIRTUAL只在程序實際使用處理器時間時遞減。由於你的程序大多隻是在睡覺,所以不會佔用太多的處理器時間。要驗證,請使用unix'time'命令(或您的OS等效項)來查看程序使用的實際,用戶和系統時間。我只會打賭真正的時間足以激活一個計時器。你可以嘗試使你的VIRTUAL和PROF定時器的間隔更小,或者做一些不會在你的死循環中阻塞的東西(例如:刪除睡眠(1))。