2016-02-10 11 views
5

Ich brauche mein Programm, um ein anderes Programm auszuführen, aber wenn das andere Programm nicht innerhalb einer bestimmten Zeit zurückkehrt, muss ich es beenden. Ich habe die folgende Lösung gefunden, die zu funktionieren scheint.Bessere Möglichkeit, den laufenden Prozess eines anderen Programms in Linux zu überwachen und zu beenden?

int main() 
{ 
int retval, timeout=10; 
pid_t proc1=fork(); 

if(proc1>0) 
{ 
    while(timeout) 
    { 
     waitpid(proc1, &retval, WNOHANG); 
     if(WIFEXITED(retval)) break; //normal termination 
     sleep(1); 
     --timeout; 
     if(timeout==0) 
     { 
      printf("attempt to kill process\n"); 
      kill(proc1, SIGTERM); 
      break; 
     } 
    } 
} 
else if(proc1==0) 
{ 
    execlp("./someprogram", "./someprogram", "-a", "-b", NULL); 
} 
//else if fork failed etc. 
return 0; 
} 

Ich brauche mein Programm so robust wie möglich zu sein, aber ich bin neu in der Programmierung unter Linux, damit ich nicht möglicher Probleme mit ihm bewusst. Meine Fragen sind: 1. Ist das eine richtige Lösung für dieses spezielle Problem oder gibt es bessere Methoden? 2. Sieht jemand mögliche Probleme oder Fehler, die zu einem unerwarteten Verhalten oder zu einem Verlust von Systemressourcen führen können?

Antwort

2

(WIFEXITED(retval)) wird nicht wahr zurückgegeben, wenn das Programm durch ein Signal (einschließlich eines Absturzes aufgrund einer Segmentierungsverletzung) beendet wird.

Wahrscheinlich am besten, um nur für eine erfolgreiche Rückkehr von waitpid zu überprüfen. Das wird nur passieren, wenn das Programm beendet wird (freiwillig oder nicht).

Je nachdem, wie wichtig es ist sicher zu machen ist, wird der Prozess gegangen ...
nach dem Prozess mit SIGTERM töten, könnten Sie eine Sekunde oder so schlafen, und wenn es noch nicht weg ist, verwenden Sie SIGKILL sicher zu sein.

+0

Vielen Dank für Ihre Vorschläge. Entsprechend seinen Spezifikationen gibt 'waitpid' mit 'WNOHANG' einen Wert von> 0 zurück, wenn der untergeordnete Prozess den Status "geändert" hat. Dies bedeutet also, dass dieser "Wechsel des Staates" nur bei Prozessbeendigung stattfinden kann? – vapid

+0

Für Ihre Zwecke ist die einzige Statusänderung, wenn der Prozess beendet wird. Die anderen Anwendungen kommen nur ins Spiel, wenn (a) Sie einen Debugger schreiben (dh mit 'ptrace (2)') oder (b) wenn Sie die Flags 'WUNTRACED' oder 'WCONTINUED' angeben, dann würden Sie das auch tun informiert werden, wenn ein Stoppsignal (z. B. Ctrl-Z) oder ein Stop-by-Stop vorhanden ist. –

Verwandte Themen