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

时间:2018-05-19 13:30:24

标签: c++ gcc g++

我使用以下命令编译我的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包,用户将使用简单的组合键编译和执行特定输入文件集的代码。

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

3 个答案:

答案 0 :(得分:3)

g++ filename.cpp -o filename.o

非常糟糕的味道(即使它可以工作)。 约定 *.o文件是object files,而不是可执行文件,但在编译命令中,fileno.oexecutable输出(即由{生成} {1}})通过编译和链接。阅读invoking GCC

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

我推荐

g++

在该命令中,我们要求所有警告和调试信息,并且可执行文件名为 g++ -Wall -Wextra -g filename.cpp -o filename (没有令人困惑的filename后缀)。

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

否则,编写类似程序的shell(或使用一些shell脚本with ulimit)来运行具有某些CPU限制的可执行文件和/或使用timeout(1)

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

但是你真的应该调试你的程序using the gdb debugger以了解它的行为) 总是避免无限循环。也许您可以使用一些计时器工具(例如setitimer(2)并捕获main signal(7);同时阅读signal-safety(7))和/或在循环中查询已用实时或CPU时间(并检查它与某个阈值。)

答案 1 :(得分:1)

首先,我建议在您的程序中输入打印输出,这样您就可以弄清楚它为什么会陷入无限循环,如果您只想要有时间限制,则可以设置一个开始time()(来自ctime)和每次迭代后的时间将当前时间与起始时间点进行比较。

答案 2 :(得分:1)

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

timeout 5 ./a.out 

这个命令只会运行给定的命令(在这种情况下是可执行的)5秒