首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用"setitimer()“函数调用设置多个警报

如何使用"setitimer()“函数调用设置多个警报
EN

Stack Overflow用户
提问于 2017-11-24 10:23:34
回答 2查看 2.7K关注 0票数 1

我需要在同一进程中设置多个间隔计时器(相同类型的警报: ITIMER_REAL)。因此,我使用setitimer()系统调用来创建3个警报,每个定时器具有不同的结构来保存时间间隔值。当任何计时器到期时,它都会给调用进程一个信号SIGALRM,但是我找不到三个定时器中哪个给出了信号,我甚至不知道是否所有计时器都在运行。有没有办法找出是哪个计时器发出的信号..。谢谢。

代码语言:javascript
复制
#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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-06-22 17:50:01

不,每个进程只有一个ITIMER_REAL计时器。使用setitimer多次覆盖前一个值,请参见人定时器

进程只有三种类型定时器中的一种。

在修改示例代码中的间隔时,也可以看到这一点。

代码语言:javascript
复制
timer1.it_interval.tv_sec = 1;
timer2.it_interval.tv_sec = 2;

使用nanosleep而不是sleep,因为它可能会干扰SIGALRM

现在运行代码,您将只看到5秒钟的间隔。

还可以通过提供第二个struct itimerval来检索上一个集值。

代码语言:javascript
复制
struct itimerval old1, old2, old3;
setitimer(ITIMER_REAL, &timer1, &old1);
setitimer(ITIMER_REAL, &timer2, &old2);
setitimer(ITIMER_REAL, &timer3, &old3);

old1将包含零值,因为这是第一次使用setitimerold2包含it_interval = 1 secold3包含it_interval = 2 secit_value将是不同的,这取决于在调用setitimer之间经过了多长时间。

所以,如果你需要多个计时器,你需要做一些簿记。每次计时器过期时,必须计算下一个定时器,并相应地调用setitimer

作为一种选择,您可以查看POSIX定时器。这允许创建多个定时器。

程序可以使用timer_create()创建多个间隔定时器。

并通过sigevent将一些id传递给处理程序。尽管手册页末尾的示例看起来更复杂一些。

票数 1
EN

Stack Overflow用户

发布于 2017-11-24 10:26:58

如果我正确理解你的问题,你想知道不同计时器的状态。

在参考值中,getitimer函数可以雪崩:

函数getitimer()用指定的计时器( ITIMER_REAL、ITIMER_VIRTUAL或ITIMER_PROF之一)的当前设置填充由ITIMER_REAL所指向的结构。元素it_value设置为计时器上的剩余时间,如果禁用定时器,则设置为零。类似地,it_interval被设置为重置值。

您可以在这里找到完整的参考资料,链接

希望这有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47471166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档