2013-02-13 18 views
8

Un processo ha una chiamata 'forchetta' dopo un gestore di segnale è stato registrato [per SIGINT]. cosa succede quando SIGINT viene inviato tramite la riga di comando? se i genitori escono o i figli o entrambi? genitore e figlio sono entrambi in esecuzione infiniti mentre i loop.comportamento di genitore e bambino per un gestore di segnale

risposta

12

Se si esegue fork (senza ulteriore exec*) dopo che un gestore di segnale è stato registrato, lo stesso gestore di segnale verrà utilizzato nei processi padre e figlio. Cioè, se fai qualcosa di diverso da exit nel tuo gestore SIGINT, nessuno dei due genitori o figlio uscirà (come è stato inviato SIGINT è irrilevante qui).

Se si intende una SIGINT inviato dal terminale (da vintr carattere che di solito è Ctrl+C): sarà ricevuto da processi che utilizzano il terminale come terminale di controllo. Cioè, a meno che non si scollega figlio o genitore dal terminale di controllo, entrambi saranno reagire a Ctrl+C chiamando il gestore SIGINT.

+0

Ma il gestore di segnale viene registrato prima di fork(), in modo che il bambino non dovrebbe avere la copia. Dopo fork() il bambino deve eseguire le istruzioni seguenti il ​​fork(). la registrazione del gestore di segnale sarà solo nel genitore. – Puneet

+4

@Puneet È * ereditato * dal bambino, qualunque cosa tu pensi di come dovrebbe * essere *. Vedi 'man sigaction'. Cosa c'è di strano in questo? descrittori di file aperti prima di 'fork' sono ereditate troppo. L'unica cosa speciale dei segnali è che i gestori non predefiniti, non-ignore * sono resettati su 'execve' e amici (perché l'indirizzo del gestore non ha senso in un nuovo eseguibile), ma niente di simile accade su' fork'. –

+0

Thank u signore ... dubbio eliminato ... – Puneet

Problemi correlati