使用 C/C++ 实现执行超时

Posted

技术标签:

【中文标题】使用 C/C++ 实现执行超时【英文标题】:Implementing execution timeout with C/C++ 【发布时间】:2015-05-07 21:59:47 【问题描述】:

我一直在考虑在我的代码中实现执行超时机制。我浏览并寻找建议,但我看到的只是为正在调用的其他程序实现执行超时,这不是我的想法。

我在 Linux 上使用 C/C++。

不使用外部库的最佳方法是什么?我认为可能运行一个单独的线程,在超时时向进程 ID 发送一个 TERM 信号,然后程序处理它并退出,但我不知道它在良好实践方面是否正确。

你会如何实现它?

提前致谢

【问题讨论】:

取决于您要限制的代码。如果是您自己的代码,最好在代码本身中添加对超时的支持。贴出你的真实代码,否则问题太笼统了。 这是一个非常简单的代码,它所做的只是读取一些文件并解析参数。这不是很有趣,但如果有必要我可以发布它。 我要限制的是从程序被调用到几秒过去的时间 【参考方案1】:

您可以在 Linux 上使用setitimer(2) 在给定时间后获取 SIGVTALRM

这就是设置计时器的方式:

#include <sys/time.h>

/* Start a timer that expires after 2.5 seconds */
struct itimerval timer;
timer.it_value.tv_sec = 2;
timer.it_value.tv_usec = 500000;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
setitimer (ITIMER_VIRTUAL, &timer, 0);

请注意,SIGVTALRM 的默认处理程序将终止您的程序并出现错误。 它在技术上可以工作,但如果你想干净地处理它,你可以安装这样的信号处理程序:

#include <signal.h>
#include <stdio.h>
#include <string.h>

void timer_handler (int signum)

    printf ("Timed out!\n");


/* Install timer_handler as the signal handler for SIGVTALRM. */
struct sigaction sa;
memset (&sa, 0, sizeof (sa));
sa.sa_handler = &timer_handler;
sigaction (SIGVTALRM, &sa, 0);

当然,这只适用于 Linux(也可能适用于 Mac/BSD)。

【讨论】:

【参考方案2】:

如果您只需要使用 pthreads 在超时时停止程序(正如您自己描述的那样)是一个非常好的主意。 *** 上有几个线程有类似的问题,所以我建议你看看他们的答案,例如:How to set a timeout for a function in C?

【讨论】:

以上是关于使用 C/C++ 实现执行超时的主要内容,如果未能解决你的问题,请参考以下文章

Java 实现订单未支付超时自动取消

如何在 Java 中为进程实现超时?

Hystrix 熔断器执行和超时实现机制

UDP如何实现可靠性传输-大厂高频面试题|c/c++ linux服务器开发

Java如何实现任务超时处理

C/C++不能运行时动态编译代码,编写公式编辑器,用户输入循环判断语句保存后执行该怎么实现啊?