Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向处理函数发送依赖时间的信号,并正确理解c中的setitimer、getitimer_C_Timer_Signals_Handler_Interrupt - Fatal编程技术网

向处理函数发送依赖时间的信号,并正确理解c中的setitimer、getitimer

向处理函数发送依赖时间的信号,并正确理解c中的setitimer、getitimer,c,timer,signals,handler,interrupt,C,Timer,Signals,Handler,Interrupt,我已经成功地制作了一个虚拟计时器,每当完成一个时间周期时,它就会向处理函数发送一个信号: 1使用setitimer创建的计时器周期长度相等。 2使用sigaction并实现了一个函数处理程序s.t sigaction将SIGVTALRM发送到处理程序函数。 我是按以下方式做的: void handler(int sig){ //some code } //in main: struct sigaction action; action.sa_handler = &handler; si

我已经成功地制作了一个虚拟计时器,每当完成一个时间周期时,它就会向处理函数发送一个信号:

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:如何在时间周期结束之前立即向处理函数发送信号并立即启动下一个循环忽略时间

如果您能帮忙,我们将不胜感激, 谢谢。

使用C99功能raise发出另一个信号。如果您已为指定的信号注册了信号处理程序,则控制权将传递给该函数

要知道计时器还剩多少时间,请使用getitimer。它需要两个参数:查询哪个计时器以及将其存储在何处。您可以手动查看结构以查找指定计时器的剩余时间