首先,我是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秒,它就会超时并继续前进。还有其他方法可以做到这一点吗?
答案 0 :(得分:0)
信号和警报之间的关系是警报是未决信号;警报的信号(SIGALRM)将在未来交付。 man alarm
了解详细信息,但摘要是alarm(5);
导致SIGALRM在5秒内发送,alarm(0);
取消(尚未发送)警报。发送信号时,将调用您的信号处理函数(signal()
调用的第二个参数)(这将暂停程序的主执行,直到信号处理程序返回)。
至于为什么它不起作用......什么是不发生的?您尚未提供任何详细信息。
关于更清洁的做事方式......目前尚不清楚你究竟要做什么,所以不可能回答。为什么...code...
需要超过3秒?如果这被理解,那么你的问题可能会被回答。
答案 1 :(得分:0)
如果秒数为零,则不会安排新的警报。来自alarm
manual page:
如果秒为零,则不会安排新的警报()。
但是:
无论如何,任何先前设置的闹钟()都会被取消。
因此,在第二次调用alarm
时,取消之前设置的警报。
答案 2 :(得分:0)