c - 在C中使用信号和警报作为超时

标签 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 秒的时间进行连接,如果不超时的话。然后我还希望服务器列表有一个全局超时,这样如果所有连接的总时间超过 12 秒,它就会超时并继续。我还有其他方法可以做到这一点吗?

最佳答案

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

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

至于更干净的做事方式......目前尚不清楚您到底想做什么,所以无法回答。为什么 ...code... 需要超过 3 秒?如果理解了这一点,那么您的问题也许就能得到解答。

关于c - 在C中使用信号和警报作为超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12406915/

相关文章:

c - 覆盖 C 中的函数调用

c - 我的 udp 客户端套接字中的目标端口无法访问

arrays - 无法将二维数组分配给 c 中的结构

c - eclipse 编辑器无法识别 C#define 指令

c - "effective type"的解释?

c# - C 如何断言该结构不等于 0?

c - 寻找有效的交换字符指针

c - 如何取消分支预测?

c++ - 从 WinAPI 线程调用 omp_set_num_threads 时出现问题

c - 什么是 main(ac, av) int ac;字符 **av; {...}?