2010-12-22 8 views
6

Ich schreibe einen Programm-Monitor als eine Aufgabe für einen Betriebssystem-Kurs (sehr einfach, wie eine Einführung in es).Wie kann man wissen, ob ein Programm seine Ausführung über ein Signal beendet hat?

Eines der Dinge, die der Monitor tun muss, ist, den Beendigungscode des Programms zu zeigen, das er überwachte, wenn es durch "natürliche Ursachen" oder den Code des Signals beendet wurde, das für seine Beendigung verantwortlich ist.

Im Moment warte ich nur darauf, dass das Kind seine Ausführung beendet und dann seinen Beendigungscode erfasst. Dies ist der zugehörige Code-Schnipsel:

pid_t id = -1; 
switch (id = fork()) { 
    // Error when forking: 
    case -1: 
     error(-1, "Something went wrong when forking."); 
     exit(-1); 
    // Code for the child process: 
    case 0: 
     // Just launch the program we're asked to: 
     execvp(argv[2], &argv[2]); 
     // If reached here it wasn't possible to launch the process: 
     error(1, "Process could not be launched."); 
     exit(1); 
    // Code for the parent process: 
    default: 
     // Just wait for the child to finish its execution: 
     wait(&return_value); 
} 

error(2) ist eine Logger-Funktion, nur den Code zu vereinfachen, wenn ein Fehler auftritt.

Je nachdem, wie der Prozess Ich habe verschiedene Aussagen zeigen:

Process ended: X 

oder

Process terminated with signal X. 

Wo X der Beendigungscode oder das Signal empfangen würde. Wie können wir wissen, ob der Kinderprozess wegen eines Signals beendet wurde?

Antwort

5

Von wait(2):

WIFSIGNALED(status) 
      returns true if the child process was terminated by a signal. 
    WTERMSIG(status) 
      returns the number of the signal that caused the child process to terminate. 

Sie müssen also WIFSIGNALED(return_value) überprüfen und wenn es wahr ist, überprüfen WTERMSIG(return_value).

+0

Vielen Dank! Ich hätte es im Handbuch finden sollen ... Es tut mir leid. – Johannes

Verwandte Themen