2012-04-26 55 views
2

我想捕获由setitimer发送的SIGVTALRM,我不知道为什么它不起作用。这里是我的代码:捕获SIGVTALRM信号,cp

void time(int time) { 
    cout << "time" << endl; 
    exit(0); 
} 

int main(void) { 
    signal(SIGVTALRM, time); 
    itimerval tv; 
    tv.it_value.tv_sec = 5; 
    tv.it_value.tv_usec = 0; 
    tv.it_interval.tv_sec = 5; 
    tv.it_interval.tv_usec = 0; 
    setitimer(ITIMER_VIRTUAL, &tv, NULL); 
    while (true) { 
     cout << "waiting" << endl; 
    } 
    return 0; 
} 

出于某种原因,它永远不会调用time() - 是它,因为它没有赶上信号或者因为信号没有在第一时间送到我不知道。

它应该很简单。有任何想法吗?谢谢

+0

你的意思“它不工作”是什么?这是一个一般的:) – Aslan986 2012-04-26 09:41:06

+0

是的,我编辑了这个问题。它永远不会进入时间(),所以我认为它可能无法捕捉到信号 – yotamoo 2012-04-26 09:42:40

回答

0

你确定它不工作?

一切看起来都很好。可能是你没有足够的等待。由于您正在循环内打印字符串waiting,并且您正在使用虚拟计时器,因此时钟仅在进程运行时(IO时间不包括在内)才会打勾。所以实际上你的计时器可能会在几个(> 5)秒后过期。

尝试注释掉打印部分。

0

这是由于signal函数。作为http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html提到:

The behavior of signal() varies across UNIX versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead. 

所以主要方法应该是:

int main(void) { 
    itimerval tv; 
    struct sigaction sa; 

    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = 0; 
    sa.sa_handler = timer_handler; 
    if (sigaction(SIGVTALRM, &sa, NULL) == -1) { 
     printf("error with: sigaction\n"); 
     exit(EXIT_FAILURE); 
    } 

    tv.it_value.tv_sec = 5; 
    tv.it_value.tv_usec = 0; 
    tv.it_interval.tv_sec = 5; 
    tv.it_interval.tv_usec = 0; 
    setitimer(ITIMER_VIRTUAL, &tv, NULL); 

    while (true) { 
     cout << "waiting" << endl; 
    } 

    return 0; 
}