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

how to JUDGE other program's result via cpp?

本文关键字:结果 程序 其他 何通过 CPP 判断      更新时间:2023-10-16

我有一系列cpp源文件,我想写另一个程序来判断它们是否能正确运行(给出输入并将其输出与标准输出进行比较)。那么如何:

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

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

ps。系统是Linux

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

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

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

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

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

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