C:如何暂停sigaction Timer

时间:2012-04-10 10:10:07

标签: c multithreading signals

有一个名为test()的函数,我想每隔30秒调用一次这个函数,请找到我实现的代码片段。

void init_sigaction(void) {
    struct sigaction act;    
    act.sa_handler = test; //test()
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGPROF, &act, NULL);
}


void init_time(void) {
    struct itimerval val;
    val.it_value.tv_sec = 30; //Timer 30 Seconds
    val.it_value.tv_usec = 0;
    val.it_interval = val.it_value;
    setitimer(ITIMER_PROF, &val, NULL);
}

int main()
{
  /*Set the handler for the signal SIG to HANDLER */
    signal(SIGINT, signal_handler);
    init_sigaction();
    init_time();

    Some_other_function();

}

现在我正在使用其他一些函数,我想暂停sigaction计时器直到其他函数执行。如何实现暂停中断?

谢谢,

2 个答案:

答案 0 :(得分:2)

来自setitimer的{​​{3}}:

  

设置为零的计时器(it_value为零或计时器到期且it_interval为零)停止。

使用零次调用setitimer,并使用有效的old_value参数存储计时器的当前值,以便稍后再次启动它。

修改

这样的事情怎么样:

struct itimerval old_timer;

void pause_timer()
{
    struct itimerval zero_timer = { 0 };
    setitimer(ITIMER_PROF, &zero_time, &old_timer);
}

void resume_timer()
{
    setitimer(ITIMER_PROF, &old_timer, NULL);
}

注意上述代码未经测试,只能通过阅读手册页进行编码。

答案 1 :(得分:1)

您可以考虑使用例如阻止某些信号sigprocmask(2)系统调用。

但是,我强烈建议您多次阅读signal(7)手册页。不要忘记信号处理程序可以随时发生(包括在最糟糕的时间,例如在调用fprintfmalloc ...时),因此只能直接或间接调用异步信号安全功能;并且很多库函数都不在这个小的限制集中。通常的方法是在信号处理程序中设置volatile sig_atomic_t标志,并在外面测试它。