1

有一个名为 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 计时器,直到其他功能执行。如何实现暂停中断?

谢谢,

4

2 回答 2

3

手册setitimer页:

设置为零的计时器(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);
}

注意上面的代码未经测试,仅通过阅读手册页进行编码。

于 2012-04-10T10:16:27.053 回答
1

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

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

于 2012-04-10T10:16:25.157 回答