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。(未解决)。。。已经解决,两处没关闭文件

还有最后的问题。就是虽然服务器在不断地接收请求,但是只能编译运行后一个人的代码后在编译运行下一个,如果在很短的时间内来海量个请求,那也太慢了。

 

 

原创粉丝点击