2011-06-28 36 views
18

Creo un proceso hijo usando un fork(). ¿Cómo puede el proceso principal matar al proceso secundario si el proceso secundario no puede completar su ejecución en 30 segundos? Quiero permitir que el proceso hijo se ejecute hasta 30 segundos. Si lleva más de 30 segundos, el proceso principal lo matará. ¿Tienes alguna idea para hacer eso?¿Cómo matar un proceso secundario por el proceso principal?

Respuesta

22

Enviar un SIGTERM o un SIGKILL a ella:

http://en.wikipedia.org/wiki/SIGKILL

http://en.wikipedia.org/wiki/SIGTERM

SIGTERM es educado y permite que el proceso de limpieza antes de que salga, mientras que, SIGKILL es para cuando no lo hará escuchar> :)

Ejemplo de la cáscara (página hombre: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill)

kill -9 pid

En C, puede hacer lo mismo usando la llamada al sistema kill:

kill(pid, SIGKILL); 

Consulte la siguiente página del manual: http://linux.die.net/man/2/kill

1

En el proceso padre, tenedor() el valor devuelto es el ID del proceso hijo. Rellene ese valor en alguna parte para cuando necesite terminar el proceso secundario. fork() devuelve cero (0) en el proceso hijo.

Cuando necesite finalizar el proceso hijo, use la función kill (2) con la ID del proceso devuelta por fork(), y la señal que desea entregar (por ejemplo, SIGTERM).

Recuerde llamar a wait() en el proceso hijo para evitar cualquier zombie persistente.

7

intentar algo como esto:

#include <signal.h> 

pid_t child_pid = -1 ; //Global 

void kill_child(int sig) 
{ 
    kill(child_pid,SIGKILL); 
} 

int main(int argc, char *argv[]) 
{ 
    signal(SIGALRM,(void (*)(int))kill_child); 
    child_pid = fork(); 
    if (child_pid > 0) { 
    /*PARENT*/ 
     alarm(30); 
     /* 
     * Do parent's tasks here. 
     */ 
     wait(NULL); 
    } 
    else if (child_pid == 0){ 
    /*CHILD*/ 
     /* 
     * Do child's tasks here. 
     */ 
    } 
} 
+0

¿Es necesario reiniciar la alarma ('alarma (0)') en la parte de los padres si el niño se ejecuta antes de 30 segundos? – miraj

+0

@miraj Hola, ¿tienes la solución para cancelar la alarma? Tengo una pregunta similar, escribo un socket cliente/servidor, el servidor bifurca un proceso secundario cuando el cliente de socket solicita conectarse, pero si el niño no envía ningún mensaje en 1 minuto, el servidor matará el proceso secundario. Si el cliente envía un mensaje al servidor, el temporizador se restablecerá a 1 minuto nuevamente. –

Cuestiones relacionadas