如何在C++中使用sigaction和itimergeval结构同时调度两个事件

How to schedule simultaneously two events using sigaction and itimerval structures in C++ ?

本文关键字:调度 事件 两个 结构 itimergeval C++ sigaction      更新时间:2023-10-16

我想在特定的时间安排一个事件,更准确地说,我想生成一个poisson流量。因此,我需要以指数分布生成的特定时间间隔发送数据包。我在网上做了一些研究,发现setitimer方法可以在一定时间后调度报警信号,但我不知道如何在我的情况下使用它。

谢谢你的建议。我听了你的话。我仍然有一个小问题:在我的代码中,我需要同时安排两个独立的事件,通常是同时填充两个队列。这就是我现在所做的:

void Queue_class::SetPoissonTraficFirstQueue(void)
{  // add one packet to the queue 
   struct sigaction act ; 
   struct itimerval timer ; 
   act.sa_handler = this ; 
   sigempty_set(&act.sa_mask) ; // no signal is added to the sa_mask 
   act.sa_flags = 0 ; 
   sigaction(SIGALARM, &act,0) ; 
   timer.it_value.tv_usec = 0 ; 
   timer.it_value.tv_sec = exponential_variable() ; // generates a random exponential variable
   timer.it_interval.tv_sec = 0 ; 
   timer.it_interval.tv_usec = 0 ; 
   setitimer(ITIMER_REAL, *timer, NULL) ; 
 }

其他队列的函数相同,但具有不同的指数随机变量

总的来说,我做以下事情:

int main()
{
   Queue_class queue ; 
   queue.SetPoissonTraficFirstQueue() ; 
   queue.SetPoissonTraficSecondQueue() ; 
   // do business
}

我有两个问题:

1-在sa_handler方法中用指针"this"在内部调用函数是一个好的解决方案吗?

2-在主函数中,这两个过程是否如我所愿同时发生:我的意思是,两个队列是否同时填充?

假设您想将计时器安排在今天下午6点,您会得到该时间的time_t(使用例如strptime或其他函数),然后您可以使用difftime来获得从现在到那时的秒数。此值可用于计时器的"值"(即itimerval.it_value.tv_sec)。如果间隔被清除,那么这将是一个一次性计时器。

另一方面,如果你想创建一个循环计时器,每X秒调用一次,那么将值和间隔都设置为X.

在这两个花瓶中,都使用ITIMER_REAL,并有一个信号处理程序catch SIGALRM