Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得ubuntu上php脚本中程序(c、c+;+;、java、python、php)的执行时间和内存使用率?_Php_C++_Ubuntu_G++_Shell Exec - Fatal编程技术网

如何获得ubuntu上php脚本中程序(c、c+;+;、java、python、php)的执行时间和内存使用率?

如何获得ubuntu上php脚本中程序(c、c+;+;、java、python、php)的执行时间和内存使用率?,php,c++,ubuntu,g++,shell-exec,Php,C++,Ubuntu,G++,Shell Exec,我正在尝试建立一个在线判断网站,使用php和laravel,可以判断用户提交的问题代码。服务器环境是ubuntu 每个问题都有一个输入文件和相应的输出文件,以及代码的最大执行时间限制和内存使用限制 假设,对于一个问题,输入文件是input.in,输出文件是correct.out。法官将运行用户代码并生成输出文件,并将其与correct.out进行比较,以检查解决方案是否正确。它还将检查代码是否在给定的时间限制和内存限制内运行 用户可以使用C、C++、java、Python或PHP 提交解决方案

我正在尝试建立一个在线判断网站,使用php和laravel,可以判断用户提交的问题代码。服务器环境是ubuntu

每个问题都有一个输入文件和相应的输出文件,以及代码的最大执行时间限制和内存使用限制

假设,对于一个问题,输入文件是input.in,输出文件是correct.out。法官将运行用户代码并生成输出文件,并将其与correct.out进行比较,以检查解决方案是否正确。它还将检查代码是否在给定的时间限制和内存限制内运行

<>用户可以使用C、C++、java、Python或PHP

提交解决方案 我所做的:

对于C++代码,假设用户的代码是代码。我在php脚本中使用了exec(),如下所示:

exec('g++ -o code code.cpp');

这将创建一个名为“code”的可执行文件

现在,我已使用input.in文件运行可执行文件,并使用以下命令生成output.out文件:

exec('./code < input.in > output.out');
exec('./codeoutput.out');
这将提供输出文件

现在我需要知道程序执行需要多少时间,以及在代码中运行或声明变量、数组或其他数据结构需要多少内存

我可以通过计算执行的开始时间和结束时间之间的差来找到执行时间

我的问题是:

  • 有没有更好的方法来确定执行时间

  • 如何找到程序使用了多少内存

  • 如何检查编译错误、运行时错误

    • 您的答案是:

    • 我不认为有更好的方法可以直接测量
      exec
      运行的时间

    • 探查器是唯一的方法(
      valgrind
      )。但是,探查器会影响性能(它会导致性能下降)。当进程仍在运行时,您可以通过以下命令检查其内存使用情况:

      grep-VmPeak/proc/$PID/status

    • 精度将非常差,对于类似于
      echo
      的快速过程,您甚至没有时间运行此shell命令

    • 检查退出代码(从
      g++
      /code
      )以检查错误。对于
      g++
      ,关于自定义程序,它可以具有自定义逻辑并使用自己的协议来报告错误,但通常如果
      /code
      遵循常规,它必须在错误时将退出代码设置为非零
    • 然而,一般来说,并没有确定的方法来理解程序是否正确运行,因为“正确”是关于语义而不是纯粹的编码。“正确”是软件作者希望它工作的方式。如果软件作者认为软件必须以特定代码退出,他可以独立于任何内部错误进行操作

      请参见以下代码示例:

      #include <iostream>
      #include <cstdlib>
      
      int main()
      {
          int z = 1;
          int y = 1;
          int x = 1 / (z - y);
          return 0;
      }
      
      程序退出时代码
      136
      ;原因是由C运行时实现的默认零除信号处理程序与此代码一起退出

      如果我们添加自己的信号处理程序,退出代码仍然是
      0

      #include <iostream>
      #include <cstdlib>
      
      #include <sys/types.h>
      #include <signal.h>
      
      void signal_handler (int signo) 
      {
          if(signo == SIGFPE) 
              exit(0);
      }
      
      int main()
      {
          signal(SIGFPE,(*signal_handler));
          int z = 1;
          int y = 1;
          int x = 1 / (z - y);
          return 0;
      }
      
      #包括
      #包括
      #包括
      #包括
      无效信号处理器(int signo)
      {
      if(signo==SIGFPE)
      出口(0);
      }
      int main()
      {
      信号(SIGFPE,(*信号处理器));
      intz=1;
      int y=1;
      int x=1/(z-y);
      返回0;
      }
      

      因此,当您运行完全未知的外部代码时,几乎不可能理解它真正的功能;这就是病毒的工作原理,例如,它们的行为方式与您预期的不同。

      检查退出代码(从
      g++
      /code
      )以检查错误。对于
      g++
      ,关于自定义程序,它可以有自定义逻辑并使用自己的协议报告错误,但通常如果
      /code
      遵循常规,它必须在错误时将退出代码设置为非零。我尝试了“$result=exec('/usr/bin/time-f”%e“/codeoutput.out,$res2,$res3”);”当我从ubuntu终端运行它时,它显示了经过的时间,但当在php脚本中运行时,我得到$result=“”、$res2=[]和$res3=0@user1810087您能详细说明您的答案2吗?这里$PID是执行进程id,对吗?如何找到它?“进程仍在运行时…”-如何确保它?是的,
      $PID
      是进程ID。请参阅此StackOverflow问题如何获取它:我获得了th$PID。但是当运行exec时('grep VmPeak/proc/$PID/status');没有这样的文件或目录。我还检查了proc文件夹,那里不存在$PID值@VitaliIth该文件夹在进程运行之前一直存在。当进程退出时,文件夹将被删除。这就是它的工作原理。所以,若应用程序运行时间较长,您可以使用此技巧在运行时测量它。唯一的选择是分析器,但它会严重影响性能。所以,在这种情况下/exec中的代码应该返回非零的退出代码,但我得到的是0。如何修复它?
      #include <iostream>
      #include <cstdlib>
      
      #include <sys/types.h>
      #include <signal.h>
      
      void signal_handler (int signo) 
      {
          if(signo == SIGFPE) 
              exit(0);
      }
      
      int main()
      {
          signal(SIGFPE,(*signal_handler));
          int z = 1;
          int y = 1;
          int x = 1 / (z - y);
          return 0;
      }