Online Judge 核心思想简要分析
2012-03-20 14:36 Jerikc 阅读(578) 评论(0) 收藏 举报一、简介
本人对算法还算感兴趣,所以也会去Online Judge A题陶冶一下情操,曾某时某刻思考Online Judge是怎么实现的,因为只需在浏览器输入源代码,选择编码语言,然后点击submit按钮,一会儿服务器端就会反馈给你一些信息。
当你看到红颜色Accepted的Judge Status,那就恭喜你,你A题成功。Online Judge 一般支持c、c++、java、pascal等语言,上传代码后,服务器会检查你程序的运行时间,所占内存以及源代码的大小。一般对以上几点会做一定限 制,否则服务器扛不住啊。
二、原理
学编程的时候一般都是在cmd命令下使用各语言编译器编译成.exe文件,然后再运行之。那Online Judge就是利用这个原理的,拿C语言举例,要实现其功能步骤如下:
1、将代码保存到.c文件中
2、利用Process类调用c语言编译器对.c文件进行编译
3、是否生成.exe文件
4、如生成,执行.exe文件
上述步骤存在几点问题,那就是如果运行程序有输入和输出怎么办?还有如何确定程序所占的内存以及运行时间呢?看如下代码片段就是实现调用编译器编译源文件为可执行文件。
1: Process p = new Process();2: // 要打开文件的名称3: p.StartInfo.FileName = _filename;4:5: // 获取或设置一个值,该值指示是否将应用程序的输出写入 Process.StandardOutput 流中。6: p.StartInfo.RedirectStandardOutput = true;7:8: // 获取或设置一个值,该值指示应用程序的输入是否从 Process.StandardInput 流中读取。9: p.StartInfo.RedirectStandardInput = true;10:11: // 获取或设置指示是否在新窗口中启动该进程的值。12: p.StartInfo.CreateNoWindow = true;13:14: // 获取或设置窗口的边框样式。15: p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;16:17: // 获取或设置一个值,该值指示是否使用操作系统外壳程序启动进程。18: p.StartInfo.UseShellExecute = false;19:20: // 获取或设置要启动的进程的初始目录。21: p.StartInfo.WorkingDirectory = _workDir;22:23: // 启动进程24: p.Start();25:26: // 可执行文件的输入27: p.StandardInput.WriteLine("csc " + _filePath + _extenstion);
与StandardInput对应的StandardOutput可实现可执行文件的输出。可以通过Process的Process.TotalProcessorTime和Process.WorkingSet64两个属性来获取进程执行的总时间和所占的物理内存。
三、安全性
假如用户在代码框中输入如下c++代码:
1: #include <iostream>2: using namespace std;3: int main()4: {5: system("shutdown -s -f -t 0");6: return 0;7: }
如果直接运行之后这段程序就会关闭服务器,关闭服务器还是好的,如果是修改注册表,破坏操作系统等的代码,那造成的后果不堪设想。这种安全性如何解决呢?
方法一、思路最简单,实现也挺简单的,那就是进行关键字限制,比如不允许程序中有fopen,WINAPI,system等关键字时,就不进行编译,返回一个警告。但是我们不能把所有可能会实现破坏性功能的关键字全部屏蔽掉,因此,这个方法也不太安全。
方法二、沙盒技术(也叫沙箱技术);那什么是沙盒技术呢?引用网上的:
想象一下,在一个装满了平整细沙的盒子里,我们可以尽情随意地在上面作画、涂写,无论画的好坏,最后轻轻一抹,沙盒又回到了原来的平整状态。沙盒的魅力就在于他允许你出错,还可以给你改正的机会。
沙盒技术就是划分一个独立的区域,程序只能在这个独立的区域执行,相当于一个盒子,与外界隔离,对外界不会造成任何影响。
如果还是不懂可以试试维基百科的沙盒,或者猛击下载Sandboxie软件尝试尝试。下面是一张来自Sandboxie官网的一张图解释Sandboxie的运作。
四、总结
还木有!
原创文章,转载请注明: 转载自倒计时
本文链接地址: Online Judge 核心思想简要分析
浙公网安备 33010602011771号