Finito coi lupi mannari. Anzi no, erano zombie, ma tanto piu` o meno siamo
[gapil.git] / prochand.tex
index b74cacdfa791b708e52caae0748dba8264e131ae..2283fe4dc05586edbb3cb136d20277bcca06f8f2 100644 (file)
@@ -666,27 +666,49 @@ e come si vede, dato che non si 
 terminazione, i tre processi figli sono ancora presenti pur essendosi
 conclusi, con lo stato di zombie e l'indicazione che sono stati terminati.
 
-La possibilità di avere degli zombie deve essere tenuta presente quando si
-scrive un programma che deve essere mantenuto in esecuzione a lungo e creare
-molti figli. In questo caso si deve sempre avere cura di far leggere
+La possibilità di avere degli zombie deve essere tenuta sempre presente quando
+si scrive un programma che deve essere mantenuto in esecuzione a lungo e
+creare molti figli. In questo caso si deve sempre avere cura di far leggere
 l'eventuale stato di uscita di tutti i figli (in genere questo si fa
 attraverso un apposito \textit{signal handler}, che chiama la funzione
-\func{wait} vedi \secref{sec:sig_xxx} e \secref{sec:proc_wait}). Questa
+\func{wait}, vedi \secref{sec:sig_xxx} e \secref{sec:proc_wait}). Questa
 operazione è necessaria perché anche se gli \textit{zombie} non consumano
 risorse di memoria o processore, occupano comunque una voce nella tabella dei
 processi, che a lungo andare potrebbe esaurirsi.
 
-Si noti che quando un processo adottato da \cmd{init} termina esso non diviene
-uno \textit{zombie}, in quanto una delle funzioni di \cmd{init} è appunto
-quella di chiamare \func{wait} per i processi di cui fa da padre. Questo è
-quanto avviene ad esempio nel caso dell'ultimo esempio: scaduti i dieci
-secondi \cmd{forktest} esce, siccome i suoi figli vengono ereditati da
-\cmd{init} il quale provvederà.
+Si noti che quando un processo adottato da \cmd{init} termina, esso non
+diviene uno \textit{zombie}; questo perché una delle funzioni di \cmd{init} è
+appunto quella di chiamare la funzione \func{wait} per i processi cui fa da
+padre, completandone la terminazione. Questo è quanto avviene anche quando,
+come nel caso del precedente esempio con \cmd{forktest}, il padre termina con
+dei figli in stato di zombie: alla sua terminazione infatti tutti i suoi figli
+vengono ereditati (compresi gli zombie) verranno adottati da \cmd{init}, il
+quale provvederà a completarne la terminazione.
+
+Si tenga presente infine che siccome gli zombie sono processi già terminati,
+non c'è modo di eliminarli con il comando \cmd{kill}; l'unica possibilità è
+quella di terminare il processo che li ha generati, in modo che \cmd{init}
+possa adottarli e provvedere a concludere la terminazione.
 
 
 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}
 \label{sec:proc_wait}
 
+Come accennato la funzioni che permettono di leggere lo stato di uscita di un
+processo, e di completarne il processo di terminazione sono \func{wait} e
+\func{waitpid}, il loro prototipo è:
+\begin{functions}
+\headdecl{sys/types.h}
+\headdecl{sys/wait.h}
+\funcdecl{pid\_t wait(int * status)} 
+\funcdecl{pid\_t waitpid(pid\_t pid, int *status, int options)}
+\end{functions}
+
+
+Come abbiamo appena visto una delle azioni prese dal kernel alla terminazione
+di un processo è quella di salvarne lo stato e mandare un segnale di
+\macro{SIGCHLD} al padre (torneremo su questa parte in \secref{sec:sig_xxx}).
+
 
 \subsection{Le funzioni \texttt{exec}}
 \label{sec:proc_exec}