2012-11-07 14 views
7

Ho il seguente codice che crea un fork figlio. E voglio uccidere il bambino prima che finisca la sua esecuzione nel genitore. come farlo?come uccidere il figlio della forchetta?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int i; 

main (int ac, char **av) 
{ 
    int pid; 

    i = 1; 

    if ((pid = fork()) == 0) { 
    /* child */ 
    while (1) { 
     printf ("I m child\n"); 
     sleep (1); 
    } 
    } 
    else { 
    /* Error */ 
    perror ("fork"); 
    exit (1); 
    } 
    sleep (10) 

    // TODO here: how to add code to kill child?? 

} 
+3

'fork()' restituisce un 'pid_t' , non un 'int', quindi dovresti dichiarare la tua variabile come tale. –

+1

Non correlato alla domanda originale: Quando fork restituisce un nuovo processo viene generato (in caso di successo) e sia padre che figlio continuano l'esecuzione dal punto in cui è stato chiamato 'fork'. pid = 0 per un processo figlio (beh, può sempre farlo tramite getpid()) e pid> 0 per un processo genitore. L'errore è solo quando la forcella restituisce -1. Nel tuo codice stai trattando una parte del "processo genitore" come un errore. –

+0

possibile duplicato di [Come uccidere un processo figlio dal processo padre?] (Http://stackoverflow.com/questions/6501522/how-to-kill-a-child-process-by-the-parent-process) – goozez

risposta

8

Invia un segnale.

#include <sys/types.h> 
#include <signal.h> 

kill(pid, SIGKILL); 

/* or */ 

kill(pid, SIGTERM); 

La seconda forma preferibile, tra l'altro, se ti gestire segnali da soli.

+5

o 'SIGTERM', se vuoi essere più gentile :) –

+2

Perché tutti insistono su SIGKILL? –

+0

@Niklas B .: C'è qualche vantaggio nell'usare 'SIGTERM' qui? Per quanto posso vedere, non ha alcun gestore. – md5

3

numero kill(pid, SIGKILL) da fuori del genitore.

9

Vedere la chiamata di sistema kill. Di solito è una buona idea usare SIGTERM per dare al processo un'opportunità di morire con gratitudine prima di usare SIGKILL.

EDIT

dimenticato è necessario utilizzare waitpid per ottenere lo stato di ritorno di quel processo e prevenire i processi di zombie.

UN ULTERIORE EDIT

È possibile utilizzare il seguente codice:

kill(pid, SIGTERM); 

bool died = false; 
for (int loop; !died && loop < 5 /*For example */; ++loop) 
{ 
    int status; 
    pid_t id; 
    sleep(1); 
    if (waitpid(pid, &status, WNOHANG) == pid) died = true; 
} 

if (!died) kill(pid, SIGKILL); 

Darà il processo di 5 secondi a morire con grazia

Problemi correlati