如何对 g++ 设置执行时间限制?

How to put execution time limit on g++?

本文关键字:执行时间 设置 g++      更新时间:2023-10-16

我使用以下方法来编译我的C++程序。

g++ filename.cpp -o filename.o

然后我获取一个输入文件并将输出定向到另一个文件。

filename.o < in.txt > out.txt

但是,有时代码会进入无限循环,我无法停止它(我强制从活动监视器退出.o(。

希望它在程序上设置执行限制时间,以便在程序之后自动停止执行。有什么办法吗?

像这样:-g++ filename.cpp -o filename.o [execution_limit_here=10.0s]

编辑:- 我正在创建一个 Atom 包,用户将使用简单的组合键为一组特定的输入文件编译和执行他们的代码。

所以我无法事先预测代码是否会进入无限循环。

g++ filename.cpp -o filename.o

味道很差(即使它可以工作(。按照惯例*.o文件是目标文件,而不是可执行文件,但在编译命令中,fileno.o是通过编译和链接的可执行输出(即由g++生成(。阅读有关调用 GCC 的信息。

我猜你在Linux或POSIX(例如MacOSX,Android...(

我推荐

g++ -Wall -Wextra -g filename.cpp -o filename

在该命令中,我们要求提供所有警告和调试信息,可执行文件名为filename(没有令人困惑的.o后缀(。

标准C++不知道时间限制,但 POSIX(所以 Linux 和 MacOSX(知道,我建议将 setrlimit(2( 与RLIMIT_CPU一起使用。这应该在应用程序中编码(您可以在main的早期调用setrlimit(。

否则,编写类似程序的 shell(或使用带有ulimit的 shell 脚本(以运行具有某些 CPU 限制和/或使用超时 (1( 的可执行文件。

另请参阅时间(7(以了解时间的各种概念。

但是您确实应该调试程序(使用gdb调试器来了解其行为(,始终避免无限循环。也许您可以使用一些计时器工具(例如 setitimer(2( 并捕获SIGALRM信号 (7(;还可以读取 signal-safety(7((和/或在循环中查询经过的实际或 CPU 时间(并根据某个阈值进行检查(。

首先,我建议在你的程序上放打印输出,这样你就可以弄清楚为什么它陷入无限循环,如果你只想有一个时间限制,你可以设置一个开始时间 时钟(((从ctime开始(,并在每次迭代后将当前时间与开始时间点进行比较。

您可以在运行可执行命令时使用超时命令

timeout 5 ./a.out 

此命令将仅运行给定命令(在本例中为可执行文件(5秒钟