首先,我是 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 秒的时间进行连接,如果不超时的话。然后我还希望服务器列表有一个全局超时,这样如果所有连接的总时间超过 12 秒,它就会超时并继续。我还有其他方法可以做到这一点吗?
最佳答案
信号和警报的关系是警报是待处理信号;该警报信号(SIGALRM)将在未来发出。 man Alarm
了解详细信息,但摘要是 alarm(5);
导致 SIGALRM 在 5 秒内发送,而 alarm(0);
取消(尚未发送的)警报。发送信号时,将调用您的信号处理函数(signal()
调用的第二个参数)(这将暂停程序的主执行,直到信号处理程序返回)。
至于为什么它不起作用......什么没有发生?您尚未提供任何详细信息。
至于更干净的做事方式......目前尚不清楚您到底想做什么,所以无法回答。为什么 ...code...
需要超过 3 秒?如果理解了这一点,那么您的问题也许就能得到解答。
关于c - 在C中使用信号和警报作为超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12406915/