【问题标题】:C : How to pause sigaction TimerC : 如何暂停 sigaction Timer
【发布时间】:2012-04-10 10:10:07
【问题描述】:

有一个函数叫test(),我想每30秒调用一次这个函数,请找到我实现的代码sn-p。

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

谢谢,

【问题讨论】:

  • 您要停止计时器运行,还是推迟信号处理程序的执行?
  • 我想停止计时器,当我的其他进程完成后,我想再次运行计时器。

标签: c multithreading signals


【解决方案1】:

来自setitimermanual page

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

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

【讨论】:

  • @Nimit 添加了几个简单的函数。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多