OJ
来源:互联网 发布:jQuery 数组 find 编辑:程序博客网 时间:2024/05/03 18:02
最近闲的无聊,就做起OJ ,通过多进程。
架构为:服务器开绑定一个ip,接收代码。(直接开了一个很大的buffer接收一次,有点敷衍)。
每接到一个请求,在一个函数中解决。
此函数的任务先用system()函数编译该程序。如果编译成功fork()一个子进程。通过
if(pid>0){ FILE *f_time;FILE *f_mem;sprintf(path_time,"/proc/%d/stat",pid);sprintf(path_mem,"/proc/%d/statm",pid);while(1){//wait(&status);//if(WIFEXITED(status))//break;eax=ptrace(PTRACE_PEEKUSER,pid, 4 * ORIG_EAX, NULL);if(eax!=252){f_time=fopen(path_time,"r");f_mem=fopen(path_mem,"r");if(f_time)run_time=Get_Runtime(f_time)*10;if(f_mem)alloc_mem=Get_Alloc(f_mem)*4;if(run_time>1000)return -2;if(alloc_mem>32768)return -3;fclose(f_time);fclose(f_mem);}else{return Check(count);}ptrace(PTRACE_SYSCALL, pid, NULL, NULL);}}else if(pid==0){ptrace(PTRACE_TRACEME,0,NULL,NULL);freopen("./one/input.txt","r",stdin);sprintf(buf_pa,"./%d/output.txt",count);freopen(buf_pa,"w",stdout);sprintf(buf_pa,"./%d/re.txt",count);freopen(buf_pa,"w",stderr);sprintf(buf_pa,"./%d/student_code",count); execlp(buf_pa,buf_pa,(char *)0); }
运行程序。
在编码是主要有下列问题值得注意。
1.system()函数结束后对寄存器eax不写入252,所以子进程不能用system()。
2.exec函数族不能对段错误重定向。所以RE到目前为止还不知道怎么捕获。(未解决)
3.wait和waitpid会暂停执行自身,等待子进程发送信号或者子进程结束。
4.在编译程序时如果不断的gcc 没问题的程序都会编译错误,出现 cannot find -lxxx。(未解决)。。。已经解决,两处没关闭文件
还有最后的问题。就是虽然服务器在不断地接收请求,但是只能编译运行后一个人的代码后在编译运行下一个,如果在很短的时间内来海量个请求,那也太慢了。
- OJ
- OJ
- OJ
- OJ
- OJ
- OJ
- oj
- oj
- oj
- OJ
- OJ
- OJ
- OJ
- oj
- OJ和OJ平台
- OJ---N!
- UVa OJ
- OJ介绍
- 流量工程与光网路
- 去除在开机BIOS启动菜单(uefi菜单中)出现的ubuntu启动项
- 给力的360检测工具
- Redis之存储结构
- 新浪微博,腾讯微博,QQ号码 联合登录。。。完善中...
- OJ
- Android之BroadcastReceiver
- vs2008将SP1重新安装后,链接报错
- GDB常用命令
- 第39天的交易(2013-5-14)(-100)(-297.5)
- 3好书
- Android自定义照相机实现(拍照、保存到SD卡,利用Bundle在Acitivity交换数据)
- Android之Android的数据存储--SharedPreferences
- office 2007 word PPT 转pdf的插件