2012-03-25 2 views
3

Ich habe diesen Code:C++ Grenze CPU-Zeit zu verarbeiten

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; 
    } 

Der Prozess/var/code/p1/p1 läuft für 40 Sekunden, und ich möchte diesen Prozess beschränken, für nur 10 Sekunden laufen mit vLimitCPU(setrlimit), und nach 10 Sekunden etwas tun, ist aber nicht nichts drucken, wie „Grenzen Wert zurückgeben“ (die erste setrlimit liefert 0)

Antwort

1

die Manpage setrlimit(2) heißt es:

CPU Zeitlimit in Sekunden. Wenn der Prozess den Soft-Wert erreicht, wird ein SIGXCPU-Signal gesendet. Die Standardaktion für dieses Signal ist, den Prozess zu beenden. Das Signal kann jedoch gefangen werden, und der Handler kann die Steuerung an das Hauptprogramm zurückgeben.

Wahrscheinlich erhalten Sie keine Ausgabe, weil Ihr Ausgangsstrom nicht gespült (Ausgabe std::endl dieses Problem zu lösen). Das Programm kann durch das Signal beendet werden, bevor es seine Ausgangspuffer leeren kann. Es kann auch gut sein, dass die Puffer in erster Linie execl() nicht überleben.

Einige weitere Hinweise:

  • Dann sollten Sie implementieren die Signal-Handler und Ihr Programm wird von dort aus weiter. Implementieren Sie es, um zu sehen, ob das Signal gefangen ist.

  • Beachten Sie, dass Sie für den Fall, dass der Prozess unerwartet beendet wird, bevor die CPU-Zeit abgelaufen ist, auch eine Fallback-Lösung benötigen.

  • Beachten Sie auch, dass, wenn ich es richtig nehme, Sie auch die CPU-Zeit berücksichtigen müssen, die bereits von Ihrem Prozess bei der Festlegung der Grenze verwendet wird.

Verwandte Themen