C++开源跨平台OJ系统判题核心—— FreeJudger
By 马冬亮(凝霜 Loki)
一个人的战争(http://blog.csdn.net/MDL13412)
项目背景
本项目是为作者所在学校搭建OJ系统时衍生出来的一个项目,由于我的学弟、学妹们对Linux系统不熟悉,为了我们这批人毕业了以后,有人能维护OJ系统,因此选用了可以运行在Windows平台的开源OJ系统。
起初,我的一个同学用NOJ(南京航空航天大学的OJ)搭建起了我们协会最初版本的OJ,但是这套OJ系统的判题核心不开源,且安全性得不到保证,再加上其web界面实在是太难看,我的一位学长ZB选择hustoj做为协会的新一代OJ平台。hustoj最初被设计在Linux系统上运行,因此需要对其进行二次开发,经过验证,此OJ的移植工作主要集中在判题程序上。至此,作者和ZB发起了FreeJudger开源项目,并希望藉由此项目,推动国内OJ的发展。
功能需求
- 崩溃自动重启;
- 支持并行/并发评判;
- 支持多种语言的评判;
- 能至少在Windows平台和*nix平台运行;
- 支持安全沙箱功能(限制程序运行内存、运行时间、对系统的访问/更改等),保证系统安全。
系统架构
可执行程序
分为守护程序和监控程序两部分组成,其中守护程序是运行在后台进行评判的核心,监控程序提供一个GUI界面供用户获取守护程序运行状态,并对其进行控制(无需一直运行,可以在需要时,连接到守护程序,支持远程访问)。
PlatformLayer
- PlatformLayer用于屏蔽操作系统的细节,其组成及功能如下:
- logger:日志库,目前使用log4cxx作为核心;
- xml:配置文件解析库,目前使用RapidXML作为核心;
- filetool:提供对系统文件的基本操作(创建、删除文件/文件夹,读取、写入文件),目前使用Boost.FileSystem作为核心;
- process:提供对进程的封装,其接口为仿Linux风格,目前各平台采用原生系统调用实现;
- thread:提供POSIX兼容的线程封装,目前使用Boost.Thread作为核心;
- taskmanager:提供任务管理器,用于管理判题任务;
- sql:提供对数据库的抽象,目前支持MySQL数据库的操作;
- net:用于实现守护程序与监控程序之间的通信;
- windowsapihook:用于屏蔽掉Windows Job在一些Windows平台上弹出“应用程序错误”对话框的问题,使用微软Detours库实现。
系统软件支持
用于支撑判题程序。
操作系统
FreeJudger要支持的操作系统平台,至少要支持Windows和*nix。
项目组织
构建工具及IDE
- Windows平台:VC++ 2010
- Linux平台:Makefile + Vim
- 其他平台:Makefile
源码组织
目前正在进行Windows平台的开发,其说明如下:
- Daemon文件夹:守护程序工程;
- Test文件夹:用于临时测试代码的工程;
- judgerlib文件夹:PlatformLayer层,每个模块一个工程;
- thirdpartylib文件夹:用到的第三方库(需要编译的,在里面提供预先编译好的静态/动态库);
- doc文件夹:项目文档;
- Debug/Release文件夹:程序输出目录。
二级文件夹组织如下图所示:
项目主页
欢迎加入
群117975329,验证信息CSDN。
主要维护人:
- 周宝 you_lan_hai@foxmail.com
- 马冬亮 mdl2009@vip.qq.com