gpt4 book ai didi

c++ - SIGALRM 超时——它如何影响现有操作?

转载 作者:行者123 更新时间:2023-11-28 08:28:07 34 4
gpt4 key购买 nike

我目前正在使用 select() 作为计时器。我有一个循环内发生的网络接收操作,每隔几秒需要发生一个处理操作。

因此,select() 语句的超时不断变化——随时间减少到零,然后从 3 重新开始。

rv = select(selectmonitor+1, &readnet, NULL, NULL, &helper.timeout());

随着事物进入网络,语句会重复,helper.timeout() 传递给它的值会减少。最终,该值要么等于零,要么系统超时,这将导致处理函数执行。但是,我注意到这是相当耗费资源的——必须不断计算 helper.timeout() 的值。当我尝试每秒接收几千个数据包时,完成此操作所需的时间导致数据包丢失。

我的新想法是使用 SIGALRM 来解决这个问题。这将允许我设置一次计时器,然后在它启动时使用react。但是,我对它将如何影响我的程序感到困惑。当 SIGALRM“关闭”时,它将运行我指定的函数。但是,它将如何中断我现有的代码?一旦函数完成,我现有的代码(在 while 语句中)将如何恢复?

此外,似乎无法设置 SIGALRM 信号来调用类中的函数?它是否正确?我想我可以调用一个函数,该函数又可以调用类中的函数..

感谢您提前提供的任何帮助。

最佳答案

使用您的 SIGALRM 处理程序设置标志变量。

使用 sigaction 而不是 signal 来设置信号处理程序。不要设置 SA_RESTART 标志。如果 SA_RESTART 设置,您的选择语句将被信号中断。您的选择将返回 -1 并且 errno 将为 EINTR。

由于信号可能会在您的其他代码正在执行时发生,因此您也需要检查标志变量,可能就在进入选择之前。

我刚刚被提醒,这种模式可能会导致丢失信号,如果它发生在检查标志之后和进入选择之前。

为避免这种情况,您需要在进入 while 循环之前使用 sigprocmask 来阻止 SIGALRM 信号。然后使用 pselect 而不是 select。通过为 pselect 提供一个信号掩码而不屏蔽 SIGALRM,信号将在选择期间始终中断,而不是在任何其他时间发生。

关于c++ - SIGALRM 超时——它如何影响现有操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3241634/

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