使用信号和警报作为C中的超时

时间:2012-09-13 13:02:45

标签: c

首先,我是C的新手。我继承了一些遗留的C代码。在此应用程序中,超时无法正常工作。它使用信号和警报来创建超时。我已经阅读了这两个,我仍然有问题。

signal(SIGALRM, timeouthandler);
alarm(3);
...(connection to a server that may hang)...

alarm(0);

timeouthandler(){
...(connection to a server that may hang)...
} 

现在这个工作正常,直到我必须在代码的不同部分添加一个时间。

signal(SIGALRM, timeouthandler2);
alarm(3);
...(log the time out)...

alarm(0);

timeouthandler2(){
...(log the time out)...
}

为什么我的第二次暂停不起作用?信号和报警之间有什么联系?并且有一种更清洁(不复杂)的方式。此外,我将需要另一个包含这两个超时的超时处理程序。谢谢!!

编辑:好的,所以看起来我不能同时进行两次超时。让我解释一下我要做的事情。我有一个我想要连接的服务器列表。我希望每个连接有3秒钟连接,如果没有超时。然后我还想要一个global超时的服务器列表,这样如果所有连接时间的总时间超过12秒,它就会超时并继续前进。还有其他方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:0)

信号和警报之间的关系是警报是未决信号;警报的信号(SIGALRM)将在未来交付。 man alarm了解详细信息,但摘要是alarm(5);导致SIGALRM在5秒内发送,alarm(0);取消(尚未发送)警报。发送信号时,将调用您的信号处理函数(signal()调用的第二个参数)(这将暂停程序的主执行,直到信号处理程序返回)。

至于为什么它不起作用......什么是不发生的?您尚未提供任何详细信息。

关于更清洁的做事方式......目前尚不清楚你究竟要做什么,所以不可能回答。为什么...code...需要超过3秒?如果这被理解,那么你的问题可能会被回答。

答案 1 :(得分:0)

如果秒数为零,则不会安排新的警报。来自alarm manual page

  

如果秒为零,则不会安排新的警报()。

但是:

  

无论如何,任何先前设置的闹钟()都会被取消。

因此,在第二次调用alarm时,取消之前设置的警报。

答案 2 :(得分:0)

alarm(2)计划SIGALRM信号在给定的秒数内传递给流程,取消之前的请求。您不能设置多个此类超时。这是一个或全无。

如果您使用的是Linux,则可能需要探索可轮询的timerfd工具。