2011-11-22 16 views
12

Sono in questo comportamento strano dove ho il mio programma principale e un bambino biforcuto. Essi sono in filodiffusione come questo (i numeri sono descrittori di file):Uccidere un figlio biforcuto uccide il genitore?

___parent___ 
|   |      ____child_____ 
| 0 stdin |     |    | 
| 1 pipe1[1]----------.   | 1 stdout | 
| 2 pipe2[1]----------.\   | 2 stderr | 
|____________|   \`----------> 3 pipe1[0] | 
         `----------> 5 pipe2[0] | 
            |______________| 

Così genitore ottiene input da stdin ma reindirizza stdout e stderr a due tubi. Il bambino ha chiuso il suo stdin e utilizza invece le estremità di lettura dei tubi.

Poi ho una funzione di uccidere solo il bambino:

void killChild(){ 
    printf("Killing %d\n", (int)childID); 
    fflush(stdout); 
    kill(childID, SIGKILL); 
    waitpid(childID, NULL, 0); // getting rid of the zombie 
} 

il bambino si successo ucciso, ma il problema è che il genitore stesso viene ucciso pure. Ho controllato il PID del bambino ed è corretto.

Quindi perché il genitore muore?

+5

Mi piace il nome di questa domanda. E l'arte. – Gabe

+3

Quale segnale ha ricevuto il genitore? – hochl

+5

Il genitore tenta di scrivere su stdout o stderr dopo aver ucciso il bambino? Se è così, muore a causa della SIGPIPE. Stai cambiando la gestione di SIGCHLD? –

risposta

13

Qualsiasi tentativo da parte del genitore di scrivere su fd 1 o fd 2 dopo che il figlio è uscito, farà sì che il kernel invii SIGPIPE al genitore. Il comportamento predefinito per SIGPIPE è la chiusura del processo. Questo è probabilmente quello che sta succedendo.

+1

Questo era davvero il problema. Proprio 'close()' le pipe nel genitore l'hanno risolto. Ora devo solo trovare un modo per reimpostare stdout e stderr. – Pithikos

+3

@Pithikos dup() stdout/stderr prima di creare i tubi. Dopo aver chiuso i tubi, dup2() di nuovo al descrittore di file 1/2 di nuovo. – nos

2

È necessario gestire i segnali SIGPIPE e SIGCHLD - probabilmente ignorarli - e si dovrebbe andare bene.

+2

E forse è una buona idea aspettare i bambini terminati, sai, gli zombi ... – hochl

+1

Lo fa già, quindi non ho commentato su questo. – pajton

Problemi correlati