judge_client.cc流程图
2019-08-20 20:27:24 0 举报
BuddyOJ程序流程图
作者其他创作
大纲/内容
查询数据库获取比赛或训练信息
判断ce.txt中是否有error字符串
结束
开始
根据AC_status的值更新数据库
向数据库中写入编译出错的状态,同时将ce.txt保存到永久目录
对应命令指针对不同语言的不同编译指令
对于python等解释性语言,不需要经过这一步
设置工作目录workdir为根目录(chroot()),提高系统安全性
调用WIFEXITED(status)判断子进程是否正常结束
查看error.out文件,如果有内容则为运行错误,KILL掉子进程,监控结束
调用sig=WTERMSIG(status)取得使子进程结束的信号编号,根据sig的类别给出相应的错误
设置工作目录为workdir=“/home/judge/run+(run_id)
输出长度超限,OLE错误
创建子进程使用execvp函数执行对应命令编译源文件,并将编译信息写入ce.txt文件中
在监控结束以后统计usedtime+=ruse.ru_utime(用户使用时间)+ruse.ru_stime(系统使用时间)
如果userfile的size > outfile的size*2,则为结果超出限制,kill掉子进程,监控结束
这里需要额外考虑java代码的运行时间和空间补偿
alarm()设置定时器
父进程调用waitpid函数来等待子进程编译结束,通过查看ce.txt文件来判断是否为编译错误,若为编译错误则退出
Main文件就是用户源程序编译得到的可执行文件
有内容属于RE错误(Runtime Error)
调用WIFSIGNALED(status)检查是否为异常结束(子进程通过信号结束)
config.ini文件中包括输入输出数据文件名,每个数据点的分数和时空限制
处理源文件目录信息
exitcode=WEXITSTATUS(status)获取子进程exit()返回的结束代码,如果为0或5则为正常,否则为异常结束,根据信号的类别给出相应错误,比如SIGALRM为计时器时间到了信号,SIGXCPU为运行时间到了信号,SIGXFSZ为输出文件大小超出信号
这里会涉及的数据库表较多。事实上,还会产生每个数据点的时空消耗等数据文件
设置工作目录为/home/judge
在/home/judge/data/获取题目输入数据文件并保存路径为fullpath
这里涉及进程调试,可使用系统日志进行调试。系统日志存储与/var/log/syslog中
评测的工作目录即用即删,如有信息需要保存,需要用mv指令移动文件
对于某些特定结果,会拷贝出错信息文件到永久目录下
使用rlimit结构体设置进程的CPU运行时间,可以创建最大文件字节数,可拥有最大进程数(1),拥有的堆栈数,可用内存数
创建子进程pidApp,重定向输入输出流,读入数据,运行结果写入user.out,运行错误信息写入error.out
初始化参数配置并连接数据库
读取题目数据的config文件,确定数据文件名
调用execl使进程执行Main文件(目标程序)监控目标程序
0 条评论
下一页