实现在线评测系统
Posted q1143316492
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现在线评测系统相关的知识,希望对你有一定的参考价值。
Online judge system
概述:
研究一下在线评测系统编写的一些细节,加深对操作系统的理解,实现一个基本能用的评测机,通过shell脚本控制评测机监控用户程序。web接口和日志功能没写。
另外PE和CE功能还没写
- 编写语言c/c++, bash
- 编写环境deppin linux
- 编写工具vim gcc 7.3.0
T^T 学长牛逼!!! Orz
关键技术
1.如何在Linux中调用另一个程序
在评测系统中,我们提交一个由标准输入输出的程序,我们判断正确性的方法一部分是修改输入输出流,将输入导入程序,输出导出,和标准答案进行比对。
例如添加一下代码,在程序的开始
freopen("file_name_input", "r", stdin);
freopen("file_name_output", "w", stdout);
用户从web页面提交代码,服务器拿到代码,形成一个服务器本地的文件。那么我们如果通过评测程序去调用,监控这个用户代码即可。但是这就意味着我们需要在文件头部加上上面两句话。虽然修改用户代码是可行的,但是却比较麻烦。这个问题先放一边,我们先解决另一个问题
ps:如果修改用户代码,一种解决方案是把main函数修改,就改成适宜CppUnit库调用的形式。CppUnit是一种c++单元测试的库,虽然没用过,但是相似的Junit有提供对应的内存,时间检测。
如何让评测程序调用另一个程序
在windows下我们只需要system(cmd_commond), 在函数中填写对应cmd命令即可,linux下的system函数作用还未证实
在Linux环境下我们需要调用的是exec函数家族
当进程调用exec函数时,该进程的程序完全替换新程序,而新程序从main函数开始,创建的新程序的进程ID并未改变。exec只是从磁盘上替换了当前进程的正文段,数据段,堆段和栈段
UNIX提供了几种exe函数execl,execv,execle,execve,execlp,execvp,fexecve.这几个函数出错返回-1.若成功不返回
#include <unistd.h>
//int execv(const char* pathname, char *const argv[])
void start_bash(std::string bash) {
// 将 C++ std::string 安全的转换为 C 风格的字符串 char *
// 从 C++14 开始, C++编译器将禁止这种写法 `char *str = "test";`
// std::string bash = "/bin/bash";
char *c_bash = new char[bash.length() + 1]; // +1 用于存放 '