next up previous contents index return to home!
Next: Comunicazione fra processi Up: I segnali Previous: Un esempio   Indice   Indice analitico

Il segnale SIGCHLD

Fra tutti i vari segnali che il kernel può inviare ai vari processi, ne analizziamo uno il particolare, inviato da ogni processo al processo padre al momento della terminazione. Tale segnale è chiamato SIGCLD secondo la (vecchia) nomenclatura System V o SIGCHLD secondo la più recente nomenclatura BSD, adottata anche da Linux.

Come detto, tale segnale viene inviato al proprio padre da ogni processo quando termina, in modo che il processo padre possa effettuare chiamare la syscall wait() per togliere il figlio dallo stato di zombie. Sappiamo come alla morte del padre ogni processo figlio venga ereditato dal processo di sistema init; tale processo sfrutta proprio l'handler di SIGCHLD per effettuare la wait() sui processi rimasti``orfani''.

Il comportamento di default per SIGCLD e SIGCHLD è di ignorare i segnali, cosicché un processo non venga interrotto dalla morte di un figlio; se il processo vuole evitare di creare zombie, deve espressamente definire un handler per uno di tali segnali nol quale viene chiamata la syscall wait(). System V implementa inoltre un particolare comportamento per SIGCLD, prevedendo che se un processo dichiara esplicitamente di voler ignorare tale segnale, i figli di tale processo non diverranno zombie (è chiaro che il processo non potrà però più chiamare la syscall wait()). In pratica, una riga del tipo

signal(SIGCLD, SIG_IGN);

previene la creazione di zombie.

Un'altra differenza fra il segnale SIGCLD di System V e il segnale SIGCHLD è che quando SIGCLD è ignorato da un processo, un segnale di tale tipo inviato al processo viene perduto, mentre se SIGCHLD è inviato a un processo che lo ignora, viene bufferizzato.


next up previous contents index
Next: Comunicazione fra processi Up: I segnali Previous: Un esempio   Indice   Indice analitico
Giuseppe Lipari 2002-10-27