2012-03-25 47 views
3

我有这样的代码:C++限制CPU时间来处理

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 /代码/ P1/P1运行40秒,我想限制这个过程中只是10秒运行vLimitCPU(setrlimit)和10秒后做一些事情,但不打印没有像“限返回值”(第一setrlimit返回0)

回答

1

手册页setrlimit(2)状态:

CPU时间限制很快。当进程达到软限制时,它会发送一个SIGXCPU信号。此 信号的默认操作是终止该过程。但是,信号可以被捕获,并且处理程序可以将控制返回到主程序。

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

一些更多的建议:

  • 那么你应该实施所述信号处理器和你的程序将 从那里继续。执行它来查看是否捕获到信号是 。

  • 请注意,您还需要一个备用解决方案,用于 过程在CPU时间到期之前意外终止的情况。

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