需求:实现一个在线判题系统,用户经过浏览器编写和提交代码,经过网络传输,将代码上传到后台,后台对提交的代码进行编译运行,将编译运行结果反馈给用户
在线OJ先后台的流程:git
第三方库:httplib,json,ctemplate,boostgithub
项目分为五大模块:
网络服务模块
搭建http服务器:
本人采用的是GitHub上提供的开源的httplib.h库,在搭建http服务的时候,只须要咱们包含该头文件就能够使用了
提供http服务,串联试题模块和编译运行模块
1.获取题目列表
2.提交选中的题目
3.提交题目代码和题目描述,代码的编译框
试题模块
1.从配置文件中加载题目
a.配置文件格式:
约定配置文件当中对题目的描述
题目的编号,题目的名字,题目所在的目录,题目难度
b.加载题目的配置文件,使用数据结构保存加载出来的题目的介绍信息
c.针对每一道题目而言,须要根据给出的路径进行加载
2.提供获取总体题目的接口
给网络服务模块提供一个能够获取全部题目描述的接口,展现给用户
3.提供单个题目的接口
给网络服务模块获取单个题目描述和做答的接口,展现给用户
编译运行模块
1.编译
a.将用户提交的代码写到文件中
b.建立子进程,而且进行程序替换为g++程序,进行编译源码文件
c.获取编译结果写到标准输出文件当中或者写入标准错误文件中
2.运行
a.若是代码走到运行阶段,说明必定编译出来可执行程序了,建立子进程,而且让子进程进行程序替换,替换成可执行程序
b.将程序运行结果,保存到标准输出或者标准错误文件中
日志模块
1.提供时间戳服务:为了区分不一样的用户提交的代码,当代码写到文件当中的时候,使用时间戳来进行一个区分
工具模块
1.实现切割字符串的函数
2.提供写文件操做
3.提供读文件操做
4.提供URL解码操做json
源码地址:https://github.com/wake5up/My-c--code/tree/master/OJ-project浏览器