求思路,求,各种
LZ最近很苦恼,老师要求写一个判断引擎,就是把一个本地程序(C),编译连接,然后进行判断,输出。。。。。。。这个还好说,就是监控这个程序的运行时间和所占用的内存,LZ迷茫了,真不知道怎么写了 本帖最后由 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, 并数据库标记题目超时) XYJK1002 发表于 2012-09-26 11:01 static/image/common/back.gif
就是监控这个程序的运行时间和所占用的内存,
这个直接用 /usr/bin/time 就行了。 土鳖了吧, 用这个函数: #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 就行了。 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 14:04 编辑
/usr/bin/time怎么获取内存的, 指点一下.
MMMIX 发表于 2012-09-26 13:45 static/image/common/back.gif
看看 /usr/bin/time 你就知道土鳖的是哪个了。BTW,看看 /usr/bin/time 的源码你就知道怎么获取内存占用 ... linux_c_py_php 发表于 2012-09-26 13:49 static/image/common/back.gif
/usr/bin/time怎么获取内存的, 指点一下.
自己找 /usr/bin/time 的源码看看不就结了? 这样子, 以为你知道说一下我就不用看了.
MMMIX 发表于 2012-09-26 14:05 static/image/common/back.gif
自己找 /usr/bin/time 的源码看看不就结了? 先谢谢楼上两位大神了。。。。。。科学真是严谨阿!!! linux_c_py_php 发表于 2012-09-26 14:10 static/image/common/back.gif
这样子, 以为你知道说一下我就不用看了.
/usr/bin/time 用的是 wait3(2)。当然你也可以用 getrusage(2)。
页:
[1]
2