如何通过cpp判断其他程序的结果?

时间:2012-03-22 01:55:14

标签: c++ linux shell

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

  1. 调用/生成另一个程序,并将文件作为其标准输入
  2. 限制子进程的时间和内存(也许是setrlimit的东西?有没有例子?)
  3. 不要让进程读/写任何文件
  4. 使用文件作为其标准输出
  5. 将输出与标准输出进行比较。
  6. 我认为第二和第三是这个概率的核心部分。有没有办法做到这一点?

    PS。系统是Linux

3 个答案:

答案 0 :(得分:2)

要做到这一点,可能想要使用fork生成子计划,而不是system

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

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

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

答案 1 :(得分:1)

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() );

答案 2 :(得分:0)

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