XYJK1002 发表于 2012-09-26 11:01

求思路,求,各种

LZ最近很苦恼,老师要求写一个判断引擎,就是把一个本地程序(C),编译连接,然后进行判断,输出。。。。。。。这个还好说,就是监控这个程序的运行时间和所占用的内存,LZ迷茫了,真不知道怎么写了

linux_c_py_php 发表于 2012-09-26 11:44

本帖最后由 linux_c_py_php 于 2012-09-26 16:46 编辑

做OJ吧, 用户提交上来的程序代码你可以拿到.

合理的步骤:

1, PHP接受代码, 写到文件, 将任务丢到MQ.
2, C消费者从MQ取任务, 调用system("make xxx")编译程序, 如果system返回码为0表明编译成功, 则需验证程序执行结果是否正确.
3, 第2步成功后, 你已经成功编译得到了可执行程序, 接下来需要socketpair创建双工双向IPC, 并fork产生子进程, 将子进程的标准输出重定向到socketpair, 标准输入重定向到socketpair, 然后execl执行程序即可, 父进程select注册写与读, 然后在事件触发后将一个程序的: 测试程序用的输入内容 写给socketpair, 从socketpair读取 测试程序的输出, 一直到sockpair读到EOF/HUP等, 将子进程wait回收, 然后判断它的输出和预期的输出是否一致, 一致则程序正确, 将正确判定的信息入数据库, 否则失败入库.

PS:(select监听设置一下超时, 如果子进程超时未结束, 应强行Kill -SIGKILL, 并数据库标记题目超时)

MMMIX 发表于 2012-09-26 13:25

XYJK1002 发表于 2012-09-26 11:01 static/image/common/back.gif
就是监控这个程序的运行时间和所占用的内存,

这个直接用 /usr/bin/time 就行了。

linux_c_py_php 发表于 2012-09-26 13:36

土鳖了吧, 用这个函数:            #include <sys/times.h>
            #include <stdio.h>
            ...
            void start_clock(void);
            void end_clock(char *msg);
            ...
            static clock_t st_time;
            static clock_t en_time;
            static struct tms st_cpu;
            static struct tms en_cpu;
            ...
            void
            start_clock()
            {
                  st_time = times(&st_cpu);
            }

            /* This example assumes that the result of each subtraction
               is within the range of values that can be represented in
               an integer type. */
            void
            end_clock(char *msg)
            {
                  en_time = times(&en_cpu);

                  fputs(msg,stdout);
                  printf("Real Time: %jd, User Time %jd, System Time %jd\n",
                      (intmax_t)(en_time - st_time),
                      (intmax_t)(en_cpu.tms_utime - st_cpu.tms_utime),
                      (intmax_t)(en_cpu.tms_stime - st_cpu.tms_stime));
            }内存还是算了吧, 一下就秒的程序怎么看.

MMMIX 发表于 2012-09-26 13:25 static/image/common/back.gif
这个直接用 /usr/bin/time 就行了。

MMMIX 发表于 2012-09-26 13:45

linux_c_py_php 发表于 2012-09-26 13:36 static/image/common/back.gif
土鳖了吧, 用这个函数:内存还是算了吧, 一下就秒的程序怎么看.

看看 /usr/bin/time 你就知道土鳖的是哪个了。BTW,看看 /usr/bin/time 的源码你就知道怎么获取内存占用信息了。

linux_c_py_php 发表于 2012-09-26 13:49

本帖最后由 linux_c_py_php 于 2012-09-26 14:04 编辑

/usr/bin/time怎么获取内存的, 指点一下.

MMMIX 发表于 2012-09-26 13:45 static/image/common/back.gif
看看 /usr/bin/time 你就知道土鳖的是哪个了。BTW,看看 /usr/bin/time 的源码你就知道怎么获取内存占用 ...

MMMIX 发表于 2012-09-26 14:05

linux_c_py_php 发表于 2012-09-26 13:49 static/image/common/back.gif
/usr/bin/time怎么获取内存的, 指点一下.

自己找 /usr/bin/time 的源码看看不就结了?

linux_c_py_php 发表于 2012-09-26 14:10

这样子, 以为你知道说一下我就不用看了.

MMMIX 发表于 2012-09-26 14:05 static/image/common/back.gif
自己找 /usr/bin/time 的源码看看不就结了?

XYJK1002 发表于 2012-09-26 15:34

先谢谢楼上两位大神了。。。。。。科学真是严谨阿!!!

MMMIX 发表于 2012-09-26 16:31

linux_c_py_php 发表于 2012-09-26 14:10 static/image/common/back.gif
这样子, 以为你知道说一下我就不用看了.

/usr/bin/time 用的是 wait3(2)。当然你也可以用 getrusage(2)。
页: [1] 2
查看完整版本: 求思路,求,各种