Moodle Online Judge 1.3.1发布

新特性:

  1. 支持40余种编程语言的在线评测。新语言的支持来自于ideone.com,这是一个免费的Web服务。所有程序都是在ideone.com运行,所以对您的moodle服务器而言,是相当安全。该功能由刘琦卿开发。
  2. 因为可以使用ideone.com运行程序,所以从这个版本开始支持Windows了

下载请到:http://code.google.com/p/sunner-projects/downloads/list

Moodle Online Judge 1.3.1发布” 中有 15 条评论

  1. 你好,我下载此插件后安装过程出现一些问题,请求帮助。

    我的moodle平台是1.8.2+windows server 2003下搭建的。安装此插件后,作业栏增加了一行:[typeonlinejudge],点击后出现“Course Module ID was incorrect”。

    我是在http://code.google.com/p/sunner-projects/downloads/list上下载的,然后按网页上的安装方法进行安装。盼复!thank you!

  2. 发现一个类似的在线评测工具,http://course.sei.buaa.edu.cn,能否跟您的比较一下,不知道该用哪个了。

    1. 你试用一下它,再试用一下moodle就能看出区别了。
      我们选择moodle做为基础平台的原因,是希望我们所做的事情并不仅仅能服务于程序设计课程,而要能让更多的课程受益。

  3. 您好,我研究了您开发的这个项目,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的内存吗?

    1. 多谢关注,多谢您这么详细的提问,让看的人心中回荡一股暖流啊,呵呵。

      编译hello.c的时候加上-static参数,这样生成的目标文件会少调用很多系统调用。sandbox的作用就是过滤不正常的系统调用。现在的policy.c中是按照-static编译后的模式进行过滤的,init_syscalls[] 中记录的是所有程序在进入main之前必须调用的系统调用。

      关于helloworld内存占用的问题,可能没有-static的话,运行后会把整个libc都包含到进程的虚拟地址空间里,所以占的内存比较大吧。

      1. 感动!万谢!
        我问问题详细都是被我们学校老师逼出来的- –
        老师说我说得不详细,他们不能帮我解答- –
        我要谢谢我们学校的老师- –

        老师加油,相信很多学生会喜欢你的!

      1. strace prog.out 老师,您帮了我大忙了,解决了我两天睡不好觉的病根- –
        代表共青团感谢你(还不是党员 – -)
        要是您在我们学校,我非每天缠着你不可- –
        已经缠了我们学校好些个老师,还没缠到能解决我问题的- –
        我继续去研究了,万谢!!
        好老师!!!

      2. 我用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)

  4. 不好意思,上面有一句话打错了,就是:

    就正常了,输出提示使用内存:
    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

    上面的那句话“情况还是如下:”改为: 情况有所改变,如下:

  5. 孙老师您好,
    我在安装moodle+online judge 后,无法进行c++的测试,c++出现编译错误,ld 找不到lstdc++
    我在服务器上安装了libstdc++,并且在正确地设置了链接,同时,我在sandbox下进行make也是完全正确的,只有提交后不能编译这个问题。
    请问这是onlinejudge的bug么?

    1. 您好,我正在搭建moodle平台,我也安装了online judge这个插件,但是我不知道怎么使用,请问您,可以告诉我吗?我的QQ是827193289,邮箱是827193289@qq.com,谢谢,请指点

回复 alex 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注