我有一系列的cpp源文件,如果它们可以正确运行(我们给输入并将它们的输出与标准输出进行比较),我想将另一个程序写入JUDGE。那么如何:
我认为第二和第三是这个概率的核心部分。有没有办法做到这一点?
PS。系统是Linux
答案 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
做了基本的比较工作。