2012-03-25 82 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時間 。