有一个名为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计时器直到其他函数执行。如何实现暂停中断?
谢谢,
答案 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)手册页。不要忘记信号处理程序可以随时发生(包括在最糟糕的时间,例如在调用fprintf
或malloc
...时),因此只能直接或间接调用异步信号安全功能;并且很多库函数都不在这个小的限制集中。通常的方法是在信号处理程序中设置volatile sig_atomic_t
标志,并在外面测试它。