警报(int)在while循环中不起作用

Posted

技术标签:

【中文标题】警报(int)在while循环中不起作用【英文标题】:alarm(int) doesn't work in a while loop 【发布时间】:2016-10-31 19:34:23 【问题描述】:

我正在尝试执行此代码:

signal(SIGALRM,handler);
alarm(1);
while(1)

handler 函数只打印“test”。

alarm(1) 在这种情况下最终只会被执行一次。我试图把它放在循环中,它似乎根本没有被执行!

我对信号有点陌生。有人可以向我解释这是怎么发生的吗?

【问题讨论】:

如果你在循环中调用alarm,你会不断地将它重置为1秒,它永远不会有机会跑下来。如果您想要一个定期计时器,您可以查看setitimertimer_create 下次考虑提供MVCE。至少,显示您询问的代码,而不是显示其他代码并解释它与令您困惑的代码有何不同......另外,阅读有关您询问的功能的文档,并提及您是如何做到的找不到答案有个好主意。 【参考方案1】:

如果您只是将alarm(1) 放入示例中的循环中,您将在每次调用的几微秒内无限次调用alarm(1)。然后this 发生:

如果已经使用 alarm() 设置了警报但尚未发送,则对 alarm() 的另一个调用将取代之前的调用。

即,在循环的每次迭代中都会清除警报。而且由于您的循环永远运行,警报永远不会永久设置。

【讨论】:

@downvoter 为什么要投反对票?真的很想知道答案对我来说似乎很好。 啊哈好吧!现在我明白了。但是在发送警报之前等待有什么意义呢?我的意思是为什么我们总是要等待至少一秒钟才能发送警报? @Elirovi 在现实生活中,既然您已经醒了,那么设置警报立即响起有什么意义?同样在这里。闹钟的全部意义在于稍后唤醒你。 @kaylum 知道了。

以上是关于警报(int)在while循环中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 警报在 Android WebView 中不起作用

While循环在ResultSet java中不起作用

为啥我的 while 循环中的条件在 python 中不起作用?

R Sys.sleep 打印在 while 循环中不起作用

SQL查询在while循环中不起作用 - JAVA

std::cin 在 do-while 循环中不起作用