管道--模拟评测系统

被骗去当蓝桥杯的炮灰,但是对蓝桥杯的练习评测系统很感兴趣,我们的程序有输入函数,评测系统也能判断出来。最近有个朋友很想知道这是什么原理,我想写个程序让他理解。我知道Linux中一切皆文件,其中一般的输入是键盘,对应的文件是stdin,所以我想往stdin写内容,再使用execl调用其他进程,让输入流从中提取,代码的最初版本如下:


然而,可能stdin是缓冲区,是伪文件,也可能没有权限,或者其他原因,程序运行时发生阻塞,等待用户输入,说明写入失败,这个方法完全没戏了。后面想到Linux可以IO重定向,或许这样还能实现功能。

于是有了成功的第二个版本:用户提交的代码被服务器编译成一个程序test.out(化名),而输入的测试内容写在一个文本文件input.txt(化名),服务器上有着一个程序istream.out(化名)专门读取并输出input.txt的内容,还有一个控制程序contro.out(化名)调用另外两个两个程序,通过管道把istream.out的输出转为test.out的输入,服务器根据test.out的输出就可以判断运行结果了。为了测试效果,代码并不长,原理如下:




后来想了想,发现control.c完全不需要写那么复杂,一句话就可以搞定了,


你可能感兴趣的:(管道--模拟评测系统)