新特性:
- 支持40余种编程语言的在线评测。新语言的支持来自于ideone.com,这是一个免费的Web服务。所有程序都是在ideone.com运行,所以对您的moodle服务器而言,是相当安全。该功能由刘琦卿开发。
- 因为可以使用ideone.com运行程序,所以从这个版本开始支持Windows了
下载请到:http://code.google.com/p/sunner-projects/downloads/list
新特性:
下载请到:http://code.google.com/p/sunner-projects/downloads/list
你好,我下载此插件后安装过程出现一些问题,请求帮助。
我的moodle平台是1.8.2+windows server 2003下搭建的。安装此插件后,作业栏增加了一行:[typeonlinejudge],点击后出现“Course Module ID was incorrect”。
我是在http://code.google.com/p/sunner-projects/downloads/list上下载的,然后按网页上的安装方法进行安装。盼复!thank you!
它只支持moodle 1.9+的
赞
发现一个类似的在线评测工具,http://course.sei.buaa.edu.cn,能否跟您的比较一下,不知道该用哪个了。
你试用一下它,再试用一下moodle就能看出区别了。
我们选择moodle做为基础平台的原因,是希望我们所做的事情并不仅仅能服务于程序设计课程,而要能让更多的课程受益。
您好,我研究了您开发的这个项目,google那里已经有了版本1.4的,令我一直不解的是你的onlinejudge解压出来之后,里面的sandbox文件夹中的policy.c中的一段代码,如下:
/* syscall sequence for init code */
int init_syscalls [] = {
__NR_uname,
__NR_brk,
__NR_brk,
__NR_set_thread_area,
__NR_brk,
__NR_brk,
0
};
照我的理解,是判断初始化的,您的注释也是这么写的,我把这个文件夹单独的拿了出来,在centos 5.5 32bit 的系统下调试,安装了libsandbox-0.2.17-1.i386.rpm, 我把sand.c文件中的所有syslog函数改为printf函数输出到标准输出,并把您写的那个print函数调用用在了sandbox_excute之后,意在查看程序执行之后的系统资源消耗情况,用make命令编译了sandbox文件夹中的内容,生成了sand可执行文件,我写了一个最简单的输出hello world的程序,用这样的一句编译命令编译这个hello world程序:gcc -fno-asm -s -w -O1 ./hello.c -o ./hello.out 生成了可执行文件 hello.out
接着我又执行了这么一句命令:./sand -l cpu=1500 -l memory=20200004 -l disk=512000 -u zhang5zhang5 /root/Desktop/hello.out(我也有用root权限执行过这句话, 去掉了-u zhang5zhang5这个option,情况还是如下)
输出提示内存使用了208KB(我用的是vmware虚拟机装的centos),不解的地方的就是之后的输出:S_RESULT_RF(45) 这句话的意思是调用了不允许的系统调用(45号 __NR_brk 定义于/usr/include/asm/unistd.h之中,我也看了),我把阁下的policy.c改了一改,就是这个地方:
case S_EVENT_SYSCALL:
if (allow(pevent))
*paction = (action_t){S_ACTION_CONT};
else
*paction = (action_t){S_ACTION_CONT};
//*paction = (action_t){S_ACTION_KILL, {{S_RESULT_RF}}};
break;
就是遇到任何系统调用都即使不是allow所允许的,程序也 S_ACTION_CONT 继续执行,改了之后编译出来的就是不会提示 S_RESULT_RF 了,再次的执行了:
./sand -l cpu=1500 -l memory=20200004 -l disk=512000 -u zhang5zhang5 /root/Desktop/hello.out(我也有用root权限执行过这句话, 去掉了-u zhang5zhang5这个option,情况还是如下)
就正常了,输出提示使用内存:
status: 4
result: 1
elapsed: 383 msec
cpu.usr: 8 msec
cpu.sys: 0 msec
cpu.all: 8 msec
cpu.tsc: 0
mem.vsize: 1640 kB
令我不解的地方就是:
/* syscall sequence for init code */
int init_syscalls [] = {
__NR_uname,
__NR_brk,
__NR_brk,
__NR_set_thread_area,
__NR_brk,
__NR_brk,
0
};
请问这个地方您是如何确定的,我更改了我更改过后的policy.c令其输出所有系统调用号:
1
_SYSCALL NUM: 45
2
_SYSCALL NUM: 192
3
_SYSCALL NUM: 33
4
_SYSCALL NUM: 5
5
_SYSCALL NUM: 197
6
_SYSCALL NUM: 192
7
_SYSCALL NUM: 6
8
_SYSCALL NUM: 5
9
_SYSCALL NUM: 3
10
_SYSCALL NUM: 197
11
_SYSCALL NUM: 192
12
_SYSCALL NUM: 125
13
_SYSCALL NUM: 192
14
_SYSCALL NUM: 192
15
_SYSCALL NUM: 6
16
_SYSCALL NUM: 192
17
_SYSCALL NUM: 243
18
_SYSCALL NUM: 125
19
_SYSCALL NUM: 125
20
_SYSCALL NUM: 91
21
_SYSCALL NUM: 197
22
_SYSCALL NUM: 192
23
_SYSCALL NUM: 3
24
_SYSCALL NUM: 197
25
_SYSCALL NUM: 192
26
_SYSCALL NUM: 3
27
_SYSCALL NUM: 4
28
_SYSCALL NUM: 252
第一个就是 __NR_brk 而不是您数组中的__NR_uname,所以才导致了我第一次编译之后执行提示输出 S_RESULT_RF
好生郁闷,想问一下为什么,还有一个问题就是:一个输出hello world的最简单的C例程需要用到1640KB的内存吗?
多谢关注,多谢您这么详细的提问,让看的人心中回荡一股暖流啊,呵呵。
编译hello.c的时候加上-static参数,这样生成的目标文件会少调用很多系统调用。sandbox的作用就是过滤不正常的系统调用。现在的policy.c中是按照-static编译后的模式进行过滤的,init_syscalls[] 中记录的是所有程序在进入main之前必须调用的系统调用。
关于helloworld内存占用的问题,可能没有-static的话,运行后会把整个libc都包含到进程的虚拟地址空间里,所以占的内存比较大吧。
感动!万谢!
我问问题详细都是被我们学校老师逼出来的- –
老师说我说得不详细,他们不能帮我解答- –
我要谢谢我们学校的老师- –
老师加油,相信很多学生会喜欢你的!
补充一下:
也许不同的gcc和内核版本,会有不同的初始化系统调用序列。用strace prog.out可以看到这个序列。
strace prog.out 老师,您帮了我大忙了,解决了我两天睡不好觉的病根- –
代表共青团感谢你(还不是党员 – -)
要是您在我们学校,我非每天缠着你不可- –
已经缠了我们学校好些个老师,还没缠到能解决我问题的- –
我继续去研究了,万谢!!
好老师!!!
我用strace ./hello执行了最简单的hello world,得到如下的结果,怎么确定初始化系统调用序列呢?(ps:strace prog.out不带参数能输出东西吗?)
execve(“./hello”, [“./hello”], [/* 24 vars */]) = 0
brk(0) = 0x1ef6f000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b7c14351000
uname({sys=”Linux”, node=”db232.localdomain”, …}) = 0
access(“/etc/ld.so.preload”, R_OK) = -1 ENOENT (No such file or directory)
open(“/etc/ld.so.cache”, O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=80487, …}) = 0
mmap(NULL, 80487, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b7c14352000
close(3) = 0
open(“/lib64/libc.so.6”, O_RDONLY) = 3
read(3, “\177ELF\2\1\1\3>\1\260\331\1\271:”…, 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1699880, …}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b7c14366000
mmap(0x3ab9000000, 3481848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3ab9000000
mprotect(0x3ab914a000, 2093056, PROT_NONE) = 0
mmap(0x3ab9349000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x149000) = 0x3ab9349000
mmap(0x3ab934e000, 16632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3ab934e000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b7c14367000
arch_prctl(ARCH_SET_FS, 0x2b7c14367210) = 0
mprotect(0x3ab9349000, 16384, PROT_READ) = 0
mprotect(0x3ab8e1a000, 4096, PROT_READ) = 0
munmap(0x2b7c14352000, 80487) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), …}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b7c14352000
write(1, “hello,world!\n”, 13hello,world!
) = 13
exit_group(13)
这里函数模样的东西,就是系统调用
不好意思,上面有一句话打错了,就是:
就正常了,输出提示使用内存:
status: 4
result: 1
elapsed: 383 msec
cpu.usr: 8 msec
cpu.sys: 0 msec
cpu.all: 8 msec
cpu.tsc: 0
mem.vsize: 1640 kB
上面的那句话“情况还是如下:”改为: 情况有所改变,如下:
孙老师您好,
我在安装moodle+online judge 后,无法进行c++的测试,c++出现编译错误,ld 找不到lstdc++
我在服务器上安装了libstdc++,并且在正确地设置了链接,同时,我在sandbox下进行make也是完全正确的,只有提交后不能编译这个问题。
请问这是onlinejudge的bug么?
您好,我正在搭建moodle平台,我也安装了online judge这个插件,但是我不知道怎么使用,请问您,可以告诉我吗?我的QQ是827193289,邮箱是827193289@qq.com,谢谢,请指点