简体   繁体   English

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

[英]Code not making using of more than one signal handler

I have this code that I want to use to handle different signals. 我有要用于处理不同信号的代码。 I don't know why it never goes to timer_handler2(). 我不知道为什么它永远不会进入timer_handler2()。 It just sticks on timer_handler(). 它只是停留在timer_handler()上。 Could someone kindly tell me what I am doing wrong 有人可以告诉我我在做什么错

#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;
}

How long are you letting the program run? 您让程序运行多长时间? ITIMER_VIRTUAL only decrements when the program is actually using processor time. ITIMER_VIRTUAL仅在程序实际使用处理器时间时才递减。 Since your program is mostly just sleeping, it's not going to use much processor time. 由于您的程序大部分时间都处于睡眠状态,因此不会占用太多处理器时间。 To verify, use the unix 'time' command (or your OS equivalent) to see the real, user and system time used by the program. 要进行验证,请使用unix“时间”命令(或与您的操作系统等效的命令)查看程序使用的实际,用户和系统时间。 I'll bet only the real time is enough to activate a timer. 我敢打赌,只有实时时间才能激活计时器。

You can try making your VIRTUAL and PROF timer intervals (much) smaller, or do something that doesn't block in your infinite loop (ie: remove the sleep(1) ). 您可以尝试将VIRTUAL和PROF计时器间隔减小很多,或者做一些不会阻塞无限循环的操作(例如:删除sleep(1))。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM