我知道如何使用GNU编译程序,但某些程序可以在“Infinity Loop”中。目标是在程序中存在无限循环时避免沮丧,在一段给定的时间间隔后自动将其杀死,称为“Time litmit”。 如何使用GNU Makefile执行此操作?
示例:编译&以1s运行此代码,n = 10 ^ 10
{{1}}如果程序运行超过1秒,则必须 kill ,我需要一个 “超出时间限制”通知。
抱歉英语不好:)
答案 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 10
和sleep 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这样的调试器来逐步执行代码并找到无限循环。我不确定自动终止程序的重点是什么,除了允许你多次运行它,尽管它被破坏了。它是否会产生您需要的某种有意义的输出,而您只是不愿意找到该错误?