2012-03-25 2 views
3

У меня есть этот код: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; 
    } 

Процесс/вар/код/​​p1/p1 выполняется в течение 40 секунд, и я хочу, чтобы ограничить этот процесс, чтобы работать в течение всего 10 секунд vLimitCPU(setrlimit), и через 10 секунд что-то делать, но не не печатать ничего подобного «пределы возвращаемого значения» (первые setrlimit возвращает 0)

ответ

1

страницы человека setrlimit(2) состояния:

CPU лимит времени в секундах. Когда процесс достигает предела soft , он посылает сигнал SIGXCPU. Действие по умолчанию для этого сигнала - это прекращение процесса. Однако сигнал может быть пойманным , и обработчик может вернуть управление основной программе.

Вероятно, вы не получите никакого вывода, поскольку ваш выходной поток не покраснел (выход std::endl, чтобы решить эту проблему). Этот сигнал может быть убит сигналом, прежде чем он сможет сбросить свои выходные буферы. Также может случиться так, что буферы в первую очередь не выживут execl().

Некоторые больше советов:

  • Затем следует реализовать сказал обработчик сигнала и ваша программа будет продолжать оттуда. Внесите его, чтобы узнать, пойман ли сигнал .

  • Обратите внимание, что вам также понадобится резервное решение для случая, когда процесс неожиданно завершается до истечения времени процессора.

  • Обратите также внимание на то, что если я принимаю это правильно, вам также необходимо указать время процессора, уже используемое вашим процессом при установке лимита.