代码不使用多个信号处理程序

时间:2014-02-12 09:25:49

标签: c signals setitimer

我有这个代码,我想用来处理不同的信号。我不知道为什么它永远不会去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;
}

1 个答案:

答案 0 :(得分:0)

你让这个程序运行多久了? ITIMER_VIRTUAL仅在程序实际使用处理器时间时递减。由于你的程序大多只是睡觉,所以它不会占用太多的处理器时间。要进行验证,请使用unix'time'命令(或等效的OS)查看程序使用的实际,用户和系统时间。我敢打赌只有实时足以启动计时器。

您可以尝试使您的VIRTUAL和PROF定时器间隔(更多)更小,或者做一些不会在无限循环中阻塞的事情(即:移除睡眠(1))。