2010-12-22 10 views
6

Estoy escribiendo un monitor de programa como una tarea para un curso de sistemas operativos (muy básico, como una introducción a él).¿Cómo saber si un programa terminó su ejecución a través de una señal?

Una de las cosas que el monitor tiene que hacer es mostrar el código de terminación del programa que estaba monitoreando si terminaba por "causas naturales" o el código de la señal responsable de su terminación.

Ahora mismo estoy esperando que el niño termine su ejecución y luego capture su código de terminación. Este es el fragmento de código relacionado:

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) es una función de registro, sólo para simplificar el código cada vez que surja un error.

Dependiendo de cómo el proceso tengo que muestran diferentes estados:

Process ended: X 

o

Process terminated with signal X. 

Donde X sería el código de terminación o la señal recibida. ¿Cómo podríamos saber si el proceso del niño terminó debido a una señal?

Respuesta

5

De 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. 

por lo que necesita para comprobar WIFSIGNALED(return_value) y si bien es cierto, comprobar WTERMSIG(return_value).

+0

¡Gracias! Debería haberlo encontrado en el manual ... Lo siento por eso. – Johannes

Cuestiones relacionadas