我成功制作了一个虚拟定时器,只要一个时间周期完成就会向处理函数发送信号:
1)使用setitimer创建计时器(周期长度相等)。 2)使用sigaction并实现了一个函数处理程序s.t sigaction将SIGVTALRM发送给处理函数。 我是按照以下方式完成的:
void handler(int sig){
//some code
}
//in main:
struct sigaction action;
action.sa_handler = &handler;
sigaction (SIGVTALRM, &action, NULL);
struct itimerval timer;
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = Gquantum;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = Gquantum;
setitimer (ITIMER_VIRTUAL, &timer, NULL);
我的问题是,有时我需要在循环完成之前发送信号并重置计时器: 1)我如何知道当前周期剩余多少时间? (也许它与getitimer相关)
2)假设im在时间周期的中间(剩余时间> 0):如何在时间周期结束之前立即向处理函数发送信号并立即开始下一周期(忽略剩余时间) )
帮助将不胜感激, 感谢。
答案 0 :(得分:0)
使用C99功能raise()
发出另一个信号。如果您已为指定信号注册了信号处理程序,则控制权将传递给该函数。
要知道计时器剩余多少时间,请使用getitimer()
。它需要2个参数:查询哪个计时器以及存储它的位置。您可以手动查看结构以查找指定计时器的剩余时间。