gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:30 25 4
gpt4 key购买 nike

我需要在同一进程中设置多个间隔计时器(相同类型的警报: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);
}
}

最佳答案

不,每个进程只有一个 ITIMER_REAL 计时器。多次使用 setitimer 会覆盖之前的值,参见 man setitimer

A process has only one of each of the three types of timers.

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

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 将包含零值,因为这是您第一次使用 setitimerold2 包含 it_interval = 1 secold3 包含 it_interval = 2 secit_value 会有所不同,具体取决于调用 setitimer 之间耗时。

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


作为替代方案,您可以查看 POSIX timers .这允许创建多个计时器

A program may create multiple interval timers using timer_create().

并通过 sigevent 将一些 id 传递给处理程序.虽然example手册页末尾的内容看起来有点复杂。

关于c - 如何使用 "setitimer()"函数调用设置多个警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47471166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com