我需要在同一进程中设置多个间隔计时器(相同类型的警报: ITIMER_REAL)。因此,我使用setitimer()系统调用来创建3个警报,每个定时器具有不同的结构来保存时间间隔值。当任何计时器到期时,它都会给调用进程一个信号SIGALRM,但是我找不到三个定时器中哪个给出了信号,我甚至不知道是否所有计时器都在运行。有没有办法找出是哪个计时器发出的信号..。谢谢。
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
void timer_handler (int signum)
{
static int count = 0;
printf ("timer1 expired %d times\n", ++count);
}
int main ()
{
int m = 0;
struct sigaction sa;
struct itimerval timer1, timer2, timer3;
memset (&sa, 0, sizeof (sa));
sa.sa_handler = &timer_handler;
sigaction (SIGALRM/*SIGVTALRM*/, &sa, NULL);
timer1.it_value.tv_sec = 1;
timer1.it_value.tv_usec = 0;
timer1.it_interval.tv_sec = 5;
timer1.it_interval.tv_usec = 0;
timer2.it_value.tv_sec = 2;
timer2.it_value.tv_usec = 0/* 900000*/;
timer2.it_interval.tv_sec = 5;
timer2.it_interval.tv_usec = 0/*900000*/;
timer3.it_value.tv_sec = 3;
timer3.it_value.tv_usec = 0/* 900000*/;
timer3.it_interval.tv_sec = 5;
timer3.it_interval.tv_usec = 0/*900000*/;
setitimer (ITIMER_REAL/*ITIMER_VIRTUAL*/, &timer1, NULL);
setitimer (ITIMER_REAL/*ITIMER_VIRTUAL*/, &timer2, NULL);
setitimer (ITIMER_REAL/*ITIMER_VIRTUAL*/, &timer3, NULL);
while (1)
{
//printf("\nin main %d",m++);
//sleep(1);
}
}发布于 2018-06-22 17:50:01
不,每个进程只有一个ITIMER_REAL计时器。使用setitimer多次覆盖前一个值,请参见人定时器
进程只有三种类型定时器中的一种。
在修改示例代码中的间隔时,也可以看到这一点。
timer1.it_interval.tv_sec = 1;
timer2.it_interval.tv_sec = 2;使用nanosleep而不是sleep,因为它可能会干扰SIGALRM。
现在运行代码,您将只看到5秒钟的间隔。
还可以通过提供第二个struct itimerval来检索上一个集值。
struct itimerval old1, old2, old3;
setitimer(ITIMER_REAL, &timer1, &old1);
setitimer(ITIMER_REAL, &timer2, &old2);
setitimer(ITIMER_REAL, &timer3, &old3);old1将包含零值,因为这是第一次使用setitimer。old2包含it_interval = 1 sec,old3包含it_interval = 2 sec。it_value将是不同的,这取决于在调用setitimer之间经过了多长时间。
所以,如果你需要多个计时器,你需要做一些簿记。每次计时器过期时,必须计算下一个定时器,并相应地调用setitimer。
作为一种选择,您可以查看POSIX定时器。这允许创建多个定时器。
程序可以使用timer_create()创建多个间隔定时器。
并通过sigevent将一些id传递给处理程序。尽管手册页末尾的示例看起来更复杂一些。
发布于 2017-11-24 10:26:58
如果我正确理解你的问题,你想知道不同计时器的状态。
在参考值中,getitimer函数可以雪崩:
函数getitimer()用指定的计时器( ITIMER_REAL、ITIMER_VIRTUAL或ITIMER_PROF之一)的当前设置填充由ITIMER_REAL所指向的结构。元素it_value设置为计时器上的剩余时间,如果禁用定时器,则设置为零。类似地,it_interval被设置为重置值。
您可以在这里找到完整的参考资料,链接
希望这有帮助
https://stackoverflow.com/questions/47471166
复制相似问题