c ++限制cpu处理时间

时间:2012-03-25 15:45:46

标签: c++ c

我有这段代码:

pid_t vPid=fork(); 
    int vStat;   
    switch(vPid){
    case -1: perror("fork");
      exit(1);
    case 0:
      //proces fiu
      if(chdir("/var/code/p1")==0){
      system("make clean");
      system("make");   
          //limit on data
          struct rlimit vLimD;
          vLimD.rlim_cur = 10000000;//10Mb 
          vLimD.rlim_max =  10000000; //10Mb
      setrlimit(RLIMIT_DATA, &vLimD);
          //limit on cpu time
          struct rlimit vLimCPU;
          vLimCPU.rlim_cur = 10;//10 sec
          vLimCPU.rlim_max = 10;//10 sec
          cout<<"limits return "<<setrlimit(RLIMIT_CPU, &vLimCPU);
  execl("/var/code/p1/p1","",NULL);
      }
      else {exit(1);}
      break;
    default: 
       while(wait(&vStat)!=vPid);
          break;
    }

进程/ var / code / p1 / p1运行40秒,我想用vLimitCPU(setrlimit)将此进程限制为仅运行10秒,并在10秒后执行某些操作,但不打印任何内容比如“限制返回值”(第一个setrlimit返回0)

1 个答案:

答案 0 :(得分:1)

手册页setrlimit(2)声明:

  

CPU时间限制,以秒为单位。当过程达到软                 限制,它发送一个SIGXCPU信号。此默认操作                 信号是终止进程。但是,信号可以                 捕获,处理程序可以将控制权返回给主程序。

可能您没有收到任何输出,因为您的输出流未刷新(输出std::endl来解决此问题)。程序可以在信号刷新其输出缓冲区之前被信号杀死。也可能是缓冲区首先不会存在execl()

更多建议:

  • 然后你应该实现所述信号处理程序,你的程序将 从那里继续实现它以查看信号是否 捕获。

  • 请注意,您还需要针对该案例的后备解决方案 在CPU时间结束之前,该过程意外终止。

  • 另请注意,如果我正确使用,您还需要考虑 设置限制时进程已经使用的CPU时间。