【问题标题】:Online judge system在线裁判系统
【发布时间】:2012-02-03 18:44:41
【问题描述】:

我想创建有一些问题的网络服务和判断系统。用户应使用 C++ 编写解决方案,然后上传源代码。然后应该编译和测试代码以确定解决方案是否正确(就像 TopCoder 在您提交代码时所做的那样)。解决方案的运行应该有时间和内存限制。是否有一些现成的裁判系统可以在 Linux 上创建这样的服务?

【问题讨论】:

  • “检查程序”是什么意思?
  • 编译源代码并尝试一些输入数据。
  • 我编辑了问题并详细描述了我要查找的内容。
  • 我编辑的解决方案应该可以解决问题,只需将代码注入用户上传的任何内容。
  • 所以我假设您是在 Linux 服务器上执行此操作,这是否意味着您只打算编译不支持 .NET 的 Linux C++?

标签: c++ web-services compiler-construction


【解决方案1】:

你是说像acm.timus.ru这样的在线裁判系统吗?然后你可以在code.google.com 上尝试开源项目,我猜他们使用它here。我在这段代码之前研究了一下:基本上它可以防止一些系统调用并测量花费的时间和内存。详细请看here

【讨论】:

    【解决方案2】:

    我使用了 DomJudge 系统,该系统已准备好进行在线比赛。 http://domjudge.sourceforge.net/

    【讨论】:

      【解决方案3】:

      仅检查内存和时间上限,只需将代码自动添加到他们的项目中。另外,请参阅Limit physical memory per process 了解内存上限。

      例如,要检查内存,请添加: (针对 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#.NET 示例,但我相信你可以找到类似的东西。)

      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() 中的检查中;

      【讨论】:

      • 我编辑了问题,以便更准确地了解我正在寻找的内容。我不是指代码的静态分析。
      • 我编辑了我的帖子,您只需将内存和时间上限添加到正在编译的应用程序。
      猜你喜欢
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      相关资源
      最近更新 更多