0

首先,我是 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 秒,它就会超时并继续前进。还有其他方法可以做到这一点吗?

4

3 回答 3

0

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

至于为什么它不工作......什么没有发生?你没有提供任何细节。

至于更清洁的做事方式……目前尚不清楚您要做什么,因此无法回答。为什么会...code...超过3秒?如果理解了,那么您的问题可能会得到回答。

于 2012-09-13T13:16:27.297 回答
0

如果秒数为零,则不会安排新警报。从alarm手册页

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

但是也:

在任何情况下,任何先前设置的 alarm() 都会被取消。

因此,通过第二次调用alarm,您可以取消任何先前设置的警报。

于 2012-09-13T13:16:34.737 回答
0

alarm(2)安排SIGALRM在给定秒数内传递给进程的信号,取消先前的请求。您不能像这样设置多个超时。这是一个或没有。

如果您在 Linux 上,您可能想探索可轮询timerfd工具。

于 2012-09-13T13:16:39.923 回答