【问题标题】:how to JUDGE other program's result via cpp?如何通过cpp判断其他程序的结果?
【发布时间】:2012-03-22 01:55:14
【问题描述】:

我有一系列 cpp 源文件,如果它们可以正确运行,我想编写另一个程序给 JUDGE(提供输入并将它们的输出与标准输出进行比较)。那么如何:

  1. 调用/生成另一个程序,并提供一个文件作为其标准输入
  2. 限制子进程的时间和内存(可能是setrlimit的东西?有例子吗?)
  3. 不要让进程读/写任何文件
  4. 使用文件作为其标准输出
  5. 将输出与标准输出进行比较。

我认为第二和第三是这个问题的核心部分。有没有办法做到这一点?

ps。系统是Linux

【问题讨论】:

标签: c++ linux shell


【解决方案1】:

要正确执行此操作,您可能希望使用fork 生成子程序,而不是system

这允许您做一些事情。首先,您可以为父进程设置一些管道,以便父进程可以将输入提供给子进程,并捕获子进程的输出以与预期结果进行比较。

其次,它会让你调用seteuid(或它的近亲之一,如setreuid)来设置子进程在(非常)受限的用户帐户下运行,以防止它写入文件。当fork 在父节点中返回时,您需要调用 setrlimit 来限制子节点的 CPU 使用率。

要明确一点:与其将孩子的输出定向到文件,然后将其与预期的输出进行比较,我会直接通过管道将孩子的输出捕获到父级。如果需要,父级可以从那里将数据写入文件,但也可以直接将输出与预期的输出进行比较,而无需通过文件。

【讨论】:

    【解决方案2】:
    std::string command = "/bin/local/app < my_input.txt > my_output_file.txt 2> my_error_file.txt";
    int rv = std::system( command.c_str() );
    

    【讨论】:

    • 你在我回答后改变了问题。 “不要让进程读/写任何文件”与“使用文件作为其标准输出”和“将文件作为其标准输入”相冲突。那就是读写文件。
    【解决方案3】:

    1) STL 中的system 函数允许您执行程序(基本上就像从shell 调用一样)。请注意,这种方法本质上是不安全的,因此只能在受信任的环境中使用它。
    2)您将需要使用线程来实现这一点。有许多可用于 C++ 的线程库,但我不能给你推荐。
    [在 OP 的帖子中编辑后]
    3)这个更难。您要么必须编写一个包装器来监视对文件的读/写访问,要么执行一些 Linux/Unix 特权魔术来阻止它访问文件。
    4)您可以通过在通常调用程序的方式之后添加&gt; outFile.txt来重定向程序的输出(它认为是标准输出)(参见1))-例如otherapp &gt; out.txt
    5)您可以在保存的文件(从 3 开始)上运行 diff 到另一个文件中捕获的“黄金标准”/预期输出。或者使用其他更适合您需要的方法(例如,只要“内容”存在,您就不会关心某些格式)。 -- 这部分真的取决于你的需要。 diff 很好地完成了基本的比较工作。

    【讨论】:

      猜你喜欢
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      相关资源
      最近更新 更多