在线评委系统
Online judge system
我想创建有一些问题的web服务并判断系统。用户应该用C++编写解决方案,然后上传源代码。然后应该编译代码并进行测试,以确定解决方案是否正确(就像TopCoder在提交代码时所做的那样)。运行解决方案应该有时间和内存限制。是否有一些现成的判断系统可以在Linux上创建这样的服务?
你是说像acm.timus.ru这样的在线评委系统吗?然后你可以在code.google.com上尝试开源项目,我想他们在这里使用它。在此之前,我对代码进行了一点研究:基本上,它可以防止一些系统调用,并测量花费的时间和内存。详细信息,请看这里。
我使用了DomJudge系统,该系统已为在线比赛做好准备。http://domjudge.sourceforge.net/
只需检查内存和时间上限,只需将代码自动添加到其项目中。另请参阅限制每个进程的物理内存以了解内存上限。
例如,要检查内存,请添加:(为LINUX示例编辑)
#include "sys/types.h"
#include "sys/sysinfo.h"
#inlcude <stdio.h>
#include <pthread.h>
public long long getMemoryUsage()
{
sysinfo (&memInfo);
long long totalVirtualMem = memInfo.totalram; //Total physical memory
}
并在其Main()中添加一个新线程,该线程调用如下函数:
private const long long MAXMEMORY = 1024; // Memory cap
private const int LIMITAPPLICATION = 100; // 10 seconds
private void TimeLimitToApplication()
{
//LIMITAPPLICATION represents how many 100ms's must
//pass until time limit is reached.
while(COUNTER < LIMITAPPLICATION)
{
sleep(100);
/* Include if including code block below
if(CheckProcessThreadsIsComplete()) break;
*/
//Check memory usage every 100ms
if(getMemoryUsage() > MAXMEMORY)
break;
COUNTER++;
}
pgid = getpgid();
kill(pgid, 15);
}
您可能还需要添加另一项检查,以查看是否已完成所有线程:(我只有一个C#的例子,但我相信你可以找到类似的东西。)
public static bool CheckProcessThreadsIsComplete()
{
Process[] allProcs = Process.GetProcesses();
foreach(Process proc in allProcs)
{
ProcessThreadCollection myThreads = proc.Threads;
foreach(ProcessThread pt in myThreads)
{
//Ignore thread that you started to do time and memory checks
if(pt.Id == TIMELIMIT_AND_MEMORYCHECK_THREAD_ID) continue;
if(pt.ThreadState != (ThreadState.Unstarted | ThreadState.Stopped | ThreadState.WaitSleepJoin | ThreadState.Aborted)
return true; // all threads are not completed
}
}
return false; // all threads are completed
}
并将其添加到TimeLimitToApplication()中的检查中;
相关文章:
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 在线编译器中的分段C++没有打印消息
- 错误处理.将系统错误代码映射到泛型
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在C++游戏中与库存系统作斗争
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在gtest.中使用fff.h模拟系统API
- 如何制作无限制照明系统
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 如何传递多个 std::文件系统选项?
- 遍历顺序由 std::文件系统directory_iterator给出
- C++系统找不到指定的文件错误
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- libstdc++ 文件系统中未初始化的用法?
- 如何在ECS框架中更新组件数据和通知系统
- boost::文件系统::recursive_directory_iterator多线程安全
- 在线评委系统