【问题标题】:How to schedule simultaneously two events using sigaction and itimerval structures in C++ ?如何使用 C++ 中的 sigaction 和 itimerval 结构同时安排两个事件?
【发布时间】:2012-08-03 08:52:30
【问题描述】:

我想在特定时间安排一个事件,更准确地说,我想产生一个泊松流量。所以我需要以指数分布生成的特定时间间隔发送一个数据包。我在网上做了一些研究,发现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- 在主函数中,两个进程是否如我所愿同时发生:我的意思是两个队列同时填充?

【问题讨论】:

  • 第二个问题与您的第一个问题实际上无关,应该在 SO 上单独提出一个问题,而不是编辑这个问题。您可以随时添加一个指向此问题的链接以提供一些背景信息。

标签: c++ scheduled-tasks setitimer


【解决方案1】:

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

另一方面,如果您想创建一个循环计时器,即每 X 秒调用一次,则将值和时间间隔都设置为 X。

在这两个花瓶中,使用ITIMER_REAL,并让signal 处理程序捕获SIGALRM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多