2014-02-12 2 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

Прохладный. Это намного проще читать сейчас! Благодарю. –

ответ

0

Как долго вы можете запускать программу? ITIMER_VIRTUAL только уменьшается, когда программа фактически использует время процессора. Поскольку ваша программа в основном просто спящая, она не будет использовать много процессорного времени. Чтобы проверить, используйте команду unix 'time' (или эквивалент вашей ОС), чтобы увидеть реальное, пользовательское и системное время, используемые программой. Готов поспорить, достаточно только реального времени, чтобы активировать таймер.

Вы можете попытаться увеличить интервалы времени VIRTUAL и PROF (много) или сделать то, что не блокируется в бесконечном цикле (то есть: удалить сон (1)).

Смежные вопросы