我使用以下命令编译我的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包,用户将使用简单的组合键编译和执行特定输入文件集的代码。
所以我无法事先预测代码是否会进入无限循环。
答案 0 :(得分:3)
g++ filename.cpp -o filename.o
非常糟糕的味道(即使它可以工作)。 约定 *.o
文件是object files,而不是可执行文件,但在编译命令中,fileno.o
是executable输出(即由{生成} {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秒