X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=801e6ff1a8dc325156d238e85b4d3e4d772144d4;hp=0026cda568e002f288163801d014a5b3adae889f;hb=c1b22636d04ef04d31842b40878c83fa63ebe739;hpb=247c7ba624f39b283f9e85816c0616348f39c1b6 diff --git a/signal.tex b/signal.tex index 0026cda..801e6ff 100644 --- a/signal.tex +++ b/signal.tex @@ -289,8 +289,8 @@ Il numero totale di segnali presenti che i numeri dei segnali sono allocati progressivamente, essa corrisponde anche al successivo del valore numerico assegnato all'ultimo segnale definito. In \tabref{tab:sig_signal_list} si è riportato l'elenco completo dei segnali -definiti in Linux (estratto dalle man page), comparati con quelli definiti in -vari standard. +definiti in Linux (estratto dalle pagine di manuale), comparati con quelli +definiti in vari standard. \begin{table}[htb] \footnotesize @@ -1011,14 +1011,14 @@ e che permette di inviare un segnale a tutto un \textit{process group} (vedi \secref{sec:sess_xxx}). Solo l'amministratore può inviare un segnale ad un processo qualunque, in -tutti gli altri casi il \textit{real user id} o l'\textit{effective user id} -del processo chiamante devono corrispondere al \textit{real user id} o al -\textit{saved user id} della destinazione. Fa eccezione il caso in cui il -segnale inviato sia \macro{SIGCONT}, nel quale occorre che entrambi i processi -appartengano alla stessa sessione. Inoltre, dato il ruolo fondamentale che -riveste nel sistema (si ricordi quanto visto in \secref{sec:sig_termination}), -non è possibile inviare al processo 1 (cioè a \cmd{init}) segnali per i quali -esso non abbia un gestore installato. +tutti gli altri casi l'userid reale o l'userid effettivo del processo +chiamante devono corrispondere all'userid reale o all'userid salvato della +destinazione. Fa eccezione il caso in cui il segnale inviato sia +\macro{SIGCONT}, nel quale occorre che entrambi i processi appartengano alla +stessa sessione. Inoltre, dato il ruolo fondamentale che riveste nel sistema +(si ricordi quanto visto in \secref{sec:sig_termination}), non è possibile +inviare al processo 1 (cioè a \cmd{init}) segnali per i quali esso non abbia +un gestore installato. Infine, seguendo le specifiche POSIX 1003.1-2001, l'uso della chiamata \code{kill(-1, sig)} comporta che il segnale sia inviato (con la solita @@ -1298,8 +1298,8 @@ La granularit questo sia sotto BSD4.3 che in SUSv2 è stata definita la funzione \func{usleep} (dove la \texttt{u} è intesa come sostituzione di $\mu$); i due standard hanno delle definizioni diverse, ma le \acr{glibc} -seguono\footnote{secondo la man page almeno dalla versione 2.2.2.} seguono -quella di SUSv2 che prevede il seguente prototipo: +seguono\footnote{secondo la pagina di manuale almeno dalla versione 2.2.2.} +seguono quella di SUSv2 che prevede il seguente prototipo: \begin{prototype}{unistd.h}{int usleep(unsigned long usec)} Pone il processo in stato di sleep per \param{usec} microsecondi. @@ -1379,11 +1379,13 @@ pu completare la procedura di terminazione in modo da evitare la formazione di zombie. -In \figref{fig:sig_sigchld_handl} è mostrato il codice della nostra -implementazione del gestore; se aggiungiamo al codice di -\file{ForkTest.c} l'installazione di questo gestore potremo verificare che -ripetendo l'esempio visto in \secref{sec:proc_termination} che non si ha più -la creazione di zombie. +In \figref{fig:sig_sigchld_handl} è mostrato il codice contenente una +implementazione generica di una routine di gestione per \macro{SIGCHLD}, (che +si trova nei sorgenti allegati nel file \file{HandSIGCHLD.c}); se ripetiamo i +test di \secref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione +\cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come +gestore di \macro{SIGCHLD}) potremo verificare che non si ha più la creazione +di zombie. % è pertanto % naturale usare un esempio che ci permette di concludere la trattazione della @@ -1402,7 +1404,7 @@ la creazione di zombie. #include #include "macro.h" -void sigchld_hand(int sig) +void HandSIGCHLD(int sig) { int errno_save; int status; @@ -1425,18 +1427,19 @@ void sigchld_hand(int sig) \end{lstlisting} \end{minipage} \normalsize - \caption{Un gestore per il segnale \texttt{SIGCHLD}.} + \caption{Codice di una funzione generica di gestione per il segnale + \texttt{SIGCHLD}.} \label{fig:sig_sigchld_handl} \end{figure} Il codice del gestore è di lettura immediata; come buona norma di programmazione (si ricordi quanto accennato \secref{sec:sys_errno}) si comincia (\texttt{\small 12-13}) con il salvare lo stato corrente di -\var{errno}, in modo da poterlo ripristinare prima del ritorno del -gestore (\texttt{\small 22-23}). In questo modo si preserva il valore -della variabile visto dal corso di esecuzione principale del processo, che -sarebbe altrimenti sarebbe sovrascritto dal valore restituito nella successiva -chiamata di \func{wait}. +\var{errno}, in modo da poterlo ripristinare prima del ritorno del gestore +(\texttt{\small 22-23}). In questo modo si preserva il valore della variabile +visto dal corso di esecuzione principale del processo, che sarebbe altrimenti +sarebbe sovrascritto dal valore restituito nella successiva chiamata di +\func{wait}. Il compito principale del gestore è quello di ricevere lo stato di terminazione del processo, cosa che viene eseguita nel ciclo in @@ -1915,8 +1918,8 @@ istruzione illecita o di violazione di memoria) mentre alcuni segnali di controllo (\macro{SIGCHLD}, \macro{SIGTRAP} e \macro{SIGPOLL}) forniscono altre informazioni speecifiche. In tutti i casi il valore del campo è riportato attraverso delle costanti (le cui definizioni si trovano -\file{bits/siginfo.h}) il cui elenco dettagliato è disponibile nella man page -di \func{sigaction}. +\file{bits/siginfo.h}) il cui elenco dettagliato è disponibile nella pagina di +manuale di di \func{sigaction}. Il resto della struttura è definito come \ctyp{union} ed i valori eventualmente presenti dipendono dal segnale, così \macro{SIGCHLD} ed i