【问题标题】:How to compile a program with limit time (5s), using MinGW-Gnu C++如何使用 MinGW-Gnu C++ 编译有限时间(5s)的程序
【发布时间】:2016-01-26 01:57:37
【问题描述】:

我知道如何用 GNU 编译程序,但有些程序可以在“无限循环”中。目标是通过在某个给定的时间间隔(称为“时间限制”)后自动终止程序来避免程序中存在无限循环时的挫败感。 如何使用 GNU Makefile 来做到这一点?

示例:在 n=10^10 的情况下,在 1 秒内编译并运行此代码

int main()
{
    int n =10000000000;
    vector<int> a;
    for (int i=0;i<n)
        a.push(i);
    return 0;
}

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

抱歉英语不好:)

【问题讨论】:

  • 这是在你的代码中做的事情,而不是编译器选项。
  • 您可以在后台生成进程,然后在 shell 中运行一个计时器,如果进程没有完成则终止该进程。

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


【解决方案1】:

您可以使用带有类似序列的 shell 来做到这一点

<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
$

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

如果进程仍在运行,我将其终止并显示您想要的消息。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多