如何使用MinGW-Gnu C ++编译限制时间(5s)的程序

时间:2016-01-26 01:57:38

标签: c++ g++ gnu-make gnu

我知道如何使用GNU编译程序,但某些程序可以在“Infinity Loop”中。目标是在程序中存在无限循环时避免沮丧,在一段给定的时间间隔后自动将其杀死,称为“Time litmit”。 如何使用GNU Makefile执行此操作?

  

示例:编译&以1s运行此代码,n = 10 ^ 10

{{1}}
     

如果程序运行超过1秒,则必须 kill ,我需要一个   “超出时间限制”通知

抱歉英语不好:)

2 个答案:

答案 0 :(得分:0)

您可以使用类似

的序列来执行此操作
<program>& 
pid=$!
sleep $time_limit
if ps aux | grep $pid | grep -v grep > /dev/null
then 
  kill $pid
  echo "Time limit exceeded"
fi

以下两个示例包含和未达到时间限制(使用sleep 10sleep 3作为程序,时间限制为5秒):

$ sleep 10& pid=$!; sleep 5; if ps aux | grep $pid | grep -v grep > /dev/null; then kill $pid; echo "Time limit exceeded"; fi
Time limit exceeded
$ sleep 3& pid=$!; sleep 5; if ps aux | grep $pid | grep -v grep > /dev/null; then kill $pid; echo "Time limit exceeded"; fi
$

它的工作方式是程序在后台启动(程序名后面有&)。 pid($!)存储在名为pid的变量中。然后我等待$time_limit使用sleep,然后检查pid $pid的进程是否仍在运行。我使用| grep -v grep因为grep $pid也会出现在ps aux的输出中。

如果进程仍然运行,我会将其删除并显示您想要的消息。

这可以很容易地包含在Makefile中。如果您希望能够在其他环境中使用它,也可以在PATH中将其设为shell脚本。

答案 1 :(得分:0)

当你的程序挂起时,使用^ C来中断它。然后,进入您的代码并找到问题。使用像GDB这样的调试器来逐步执行代码并找到无限循环。我不确定自动终止程序的重点是什么,除了允许你多次运行它,尽管它被破坏了。它是否会产生您需要的某种有意义的输出,而您只是不愿意找到该错误?