本帖最后由 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[1], 标准输入重定向到socketpair[1], 然后execl执行程序即可, 父进程select注册写与读, 然后在事件触发后将一个程序的: 测试程序用的输入内容 写给socketpair[0], 从socketpair[0]读取 测试程序的输出, 一直到sockpair[0]读到EOF/HUP等, 将子进程wait回收, 然后判断它的输出和预期的输出是否一致, 一致则程序正确, 将正确判定的信息入数据库, 否则失败入库.
PS:(select监听设置一下超时, 如果子进程超时未结束, 应强行Kill -SIGKILL, 并数据库标记题目超时) |