X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=prochand.tex;h=2283fe4dc05586edbb3cb136d20277bcca06f8f2;hb=fffa3e611bff16a0d896c73bbb2d50b2fce6a3fa;hp=b74cacdfa791b708e52caae0748dba8264e131ae;hpb=35a74444a2fac699a43daefd96369aa984f91870;p=gapil.git diff --git a/prochand.tex b/prochand.tex index b74cacd..2283fe4 100644 --- a/prochand.tex +++ b/prochand.tex @@ -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}