使用 C/C++ 实现执行超时
Implementing execution timeout with C/C++
我一直在考虑在我的代码中实现一个执行超时机制。我浏览寻找建议,但我所看到的只是为其他被调用的程序实施执行超时,这不是我的想法。
我正在 Linux 上使用 C/C++。
在不使用外部库的情况下完成此任务的最佳方法是什么?我认为可能 运行 一个单独的线程在超时时向进程 ID 发送一个 TERM 信号,然后程序处理它并退出,但我不知道它在良好实践方面是否正确。
你会如何实施它?
提前致谢
如果您只需要在超时时使用 pthreads 停止程序(正如您自己描述的那样),这是一个非常好的主意。 Whosebug 上有几个线程有类似的问题,所以我建议你看看他们的答案,例如:How to set a timeout for a function in C?
您可以在 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)。
我一直在考虑在我的代码中实现一个执行超时机制。我浏览寻找建议,但我所看到的只是为其他被调用的程序实施执行超时,这不是我的想法。
我正在 Linux 上使用 C/C++。
在不使用外部库的情况下完成此任务的最佳方法是什么?我认为可能 运行 一个单独的线程在超时时向进程 ID 发送一个 TERM 信号,然后程序处理它并退出,但我不知道它在良好实践方面是否正确。
你会如何实施它?
提前致谢
如果您只需要在超时时使用 pthreads 停止程序(正如您自己描述的那样),这是一个非常好的主意。 Whosebug 上有几个线程有类似的问题,所以我建议你看看他们的答案,例如:How to set a timeout for a function in C?
您可以在 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)。