X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=302b5e35f7031e15ecd249fa5593730e2000c223;hp=b4e869f818714f40360ff416284cad7b27ca10e0;hb=922de35645e21550b70e2e5fe5ced103a0d2e0b4;hpb=4cbeb0e4fa1d31da798c8e68108eb6785586ab34 diff --git a/signal.tex b/signal.tex index b4e869f..302b5e3 100644 --- a/signal.tex +++ b/signal.tex @@ -806,14 +806,15 @@ gestore; viene mantenuto invece ogni eventuale impostazione dell'azione a programmi eseguiti in background, che altrimenti sarebbero interrotti da una successiva pressione di \texttt{C-c} o \texttt{C-y}. -Per quanto riguarda il comportamento di tutte le altre system call si danno -sostanzialmente due casi, a seconda che esse siano \index{system~call~lente} -\textsl{lente} (\textit{slow}) o \textsl{veloci} (\textit{fast}). La gran -parte di esse appartiene a quest'ultima categoria, che non è influenzata -dall'arrivo di un segnale. Esse sono dette \textsl{veloci} in quanto la loro -esecuzione è sostanzialmente immediata; la risposta al segnale viene sempre -data dopo che la system call è stata completata, in quanto attendere per -eseguire un gestore non comporta nessun inconveniente. +Per quanto riguarda il comportamento di tutte le altre \textit{system call} si +danno sostanzialmente due casi, a seconda che esse siano +\index{system~call~lente} \textsl{lente} (\textit{slow}) o \textsl{veloci} +(\textit{fast}). La gran parte di esse appartiene a quest'ultima categoria, +che non è influenzata dall'arrivo di un segnale. Esse sono dette +\textsl{veloci} in quanto la loro esecuzione è sostanzialmente immediata; la +risposta al segnale viene sempre data dopo che la \textit{system call} è stata +completata, in quanto attendere per eseguire un gestore non comporta nessun +inconveniente. In alcuni casi però alcune system call (che per questo motivo vengono chiamate \textsl{lente}) possono bloccarsi indefinitamente. In questo caso non si può @@ -1438,24 +1439,25 @@ conclusione di un processo è quella di inviare questo segnale al padre.\footnote{in realtà in SVr4 eredita la semantica di System V, in cui il segnale si chiama \signal{SIGCLD} e viene trattato in maniera speciale; in System V infatti se si imposta esplicitamente l'azione a \const{SIG\_IGN} il - segnale non viene generato ed il sistema non genera \index{zombie} zombie - (lo stato di terminazione viene scartato senza dover chiamare una - \func{wait}). L'azione predefinita è sempre quella di ignorare il segnale, - ma non attiva questo comportamento. Linux, come BSD e POSIX, non supporta - questa semantica ed usa il nome di \signal{SIGCLD} come sinonimo di + segnale non viene generato ed il sistema non genera \itindex{zombie} + \textit{zombie} (lo stato di terminazione viene scartato senza dover + chiamare una \func{wait}). L'azione predefinita è sempre quella di ignorare + il segnale, ma non attiva questo comportamento. Linux, come BSD e POSIX, non + supporta questa semantica ed usa il nome di \signal{SIGCLD} come sinonimo di \signal{SIGCHLD}.} In generale dunque, quando non interessa elaborare lo stato di uscita di un processo, si può completare la gestione della terminazione installando un gestore per \signal{SIGCHLD} il cui unico compito sia quello di chiamare \func{waitpid} per completare la procedura di -terminazione in modo da evitare la formazione di \index{zombie} zombie. +terminazione in modo da evitare la formazione di \itindex{zombie} +\textit{zombie}. In fig.~\ref{fig:sig_sigchld_handl} è mostrato il codice contenente una -implementazione generica di una funzione di gestione per \signal{SIGCHLD}, (che -si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i test -di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione -\cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come -gestore di \signal{SIGCHLD}) potremo verificare che non si ha più la creazione -di \index{zombie} zombie. +implementazione generica di una funzione di gestione per \signal{SIGCHLD}, +(che si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i +test di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con +l'opzione \cmd{-s} (che si limita ad effettuare l'installazione di questa +funzione come gestore di \signal{SIGCHLD}) potremo verificare che non si ha +più la creazione di \itindex{zombie} \textit{zombie}. \begin{figure}[!htbp] \footnotesize \centering @@ -1495,7 +1497,8 @@ rimosso verrà recapitato un solo segnale. Allora, nel caso della terminazione dei processi figli, se si chiamasse \func{waitpid} una sola volta, essa leggerebbe lo stato di terminazione per un solo processo, anche se i processi terminati sono più di uno, e gli altri -resterebbero in stato di \index{zombie} zombie per un tempo indefinito. +resterebbero in stato di \itindex{zombie} \textit{zombie} per un tempo +indefinito. Per questo occorre ripetere la chiamata di \func{waitpid} fino a che essa non ritorni un valore nullo, segno che non resta nessun processo di cui si debba @@ -1814,8 +1817,8 @@ tab.~\ref{tab:sig_sa_flag}. \var{sa\_sigaction} al posto di \var{sa\_handler}.\\ \const{SA\_NOCLDWAIT}& Se il segnale è \signal{SIGCHLD} allora i processi - figli non diventano \textit{zombie} quando - terminano.\footnotemark \\ + figli non diventano \itindex{zombie} + \textit{zombie} quando terminano.\footnotemark \\ \hline \end{tabular} \caption{Valori del campo \var{sa\_flag} della struttura \struct{sigaction}.}