Corretta ed integrata la parte relativa alla notifica dei sengali, e
[gapil.git] / signal.tex
index 250653effe452aa10211384610f120972708f64e..b304add091eda2b4ea159f14aa3e820c41f920f4 100644 (file)
@@ -1889,15 +1889,15 @@ permette\footnote{La possibilit
   real-time (vedi \secref{sec:sig_real_time}). In precedenza era possibile
   ottenere alcune informazioni addizionali usando \var{sa\_handler} con un
   secondo parametro addizionale di tipo \var{sigcontext}, che adesso è
-  deprecato.}  di utilizzare due forme diverse di gestore, da
-specificare, a seconda dell'uso o meno del flag \const{SA\_SIGINFO},
-rispettivamente attraverso i campi \var{sa\_sigaction} o \var{sa\_handler},
-(che devono essere usati in maniera alternativa, in certe implementazioni
-questi vengono addirittura definiti come \ctyp{union}): la prima è quella
-classica usata anche con \func{signal}, la seconda permette invece di usare un
-gestore in grado di ricevere informazioni più dettagliate dal sistema,
-attraverso la struttura \struct{siginfo\_t}, riportata in
-\figref{fig:sig_siginfo_t}.
+  deprecato.}  di utilizzare due forme diverse di gestore, da specificare, a
+seconda dell'uso o meno del flag \const{SA\_SIGINFO}, rispettivamente
+attraverso i campi \var{sa\_sigaction} o \var{sa\_handler},\footnote{i due
+  tipi devono essere usati in maniera alternativa, in certe implementazioni
+  questi campi vengono addirittura definiti come \ctyp{union}.}  Quest'ultima
+è quella classica usata anche con \func{signal}, mentre la prima permette di
+usare un gestore più complesso, in grado di ricevere informazioni più
+dettagliate dal sistema, attraverso la struttura \struct{siginfo\_t},
+riportata in \figref{fig:sig_siginfo_t}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2396,30 +2396,28 @@ presenta dei significativi miglioramenti,\footnote{questa estensione 
   introdotta in Linux a partire dal kernel 2.1.43(?), e dalle \acr{glibc}
   2.1(?).} in particolare sono stati superati tre limiti fondamentali dei
 segnali classici:
-\begin{description}
+\begin{basedescript}{\desclabelwidth{1cm}\desclabelstyle{\nextlinelabel}}
 \item[I segnali non sono accumulati] 
-  
   se più segnali vengono generati prima dell'esecuzione di un gestore
   questo sarà eseguito una sola volta, ed il processo non sarà in grado di
   accorgersi di quante volte l'evento che ha generato il segnale è accaduto.
-\item[I segnali non trasportano informazione] 
-  
+\item[I segnali non trasportano informazione]   
   i segnali classici non prevedono prevedono altra informazione sull'evento
   che li ha generati se non il fatto che sono stati emessi (tutta
   l'informazione che il kernel associa ad un segnale è il suo numero).
 \item[I segnali non hanno un ordine di consegna] 
-
   l'ordine in cui diversi segnali vengono consegnati è casuale e non
   prevedibile. Non è possibile stabilire una priorità per cui la reazione a
   certi segnali ha la precedenza rispetto ad altri.
-\end{description}
+\end{basedescript}
 
 
 Per poter superare queste limitazioni lo standard ha introdotto delle nuove
 caratteristiche, che sono state associate ad una nuova classe di segnali, che
-vengono chiamati \textsl{segnali real-time}, in particolare:
+vengono chiamati \textsl{segnali real-time}, in particolare le funzionalità
+aggiunte sono:
 
-\begin{itemize*}
+\begin{enumerate}
 \item i segnali sono inseriti in una coda che permette di consegnare istanze
   multiple dello stesso segnale qualora esso venga inviato più volte prima
   dell'esecuzione del gestore; si assicura così che il processo riceva un
@@ -2427,20 +2425,20 @@ vengono chiamati \textsl{segnali real-time}, in particolare:
 \item è stata introdotta una priorità nella consegna dei segnali: i segnali
   vengono consegnati in ordine a seconda del loro valore, partendo da quelli
   con un numero minore, che pertanto hanno una priorità maggiore.
-\item è stata introdotta la possibilità di restituire dei dati al
-  gestore, attraverso l'uso di un campo apposito nella struttura
-  \struct{siginfo\_t} accessibile tramite gestori di tipo
+\item è stata introdotta la possibilità di restituire dei dati al gestore,
+  attraverso l'uso di un apposito campo \var{si\_value} nella struttura
+  \struct{siginfo\_t}, accessibile tramite gestori di tipo
   \var{sa\_sigaction}.
-\end{itemize*}
+\end{enumerate}
 
-Queste nuove caratteristiche (eccetto l'ultima, che, come visto in
-\secref{sec:sig_sigaction}, è parzialmente disponibile anche con i segnali
-ordinari) si applicano solo ai nuovi segnali real-time; questi ultimi sono
-accessibili in un range di valori specificati dalle due macro \const{SIGRTMIN}
-e \const{SIGRTMAX},\footnote{in Linux di solito il primo valore è 32, ed il
-  secondo \code{\_NSIG-1}, che di norma è 63, per un totale di 32 segnali
-  disponibili, contro gli almeno 8 richiesti da POSIX.1b.} che specificano il
-numero minimo e massimo associato ad un segnale real-time.
+Queste nuove funzionalità (eccetto l'ultima, che, come vedremo, è parzialmente
+disponibile anche con i segnali ordinari) si applicano solo ai nuovi segnali
+real-time; questi ultimi sono accessibili in un range di valori specificati
+dalle due macro \const{SIGRTMIN} e \const{SIGRTMAX},\footnote{in Linux di
+  solito il primo valore è 32, ed il secondo \code{\_NSIG-1}, che di norma è
+  63, per un totale di 32 segnali disponibili, contro gli almeno 8 richiesti
+  da POSIX.1b.} che specificano il numero minimo e massimo associato ad un
+segnale real-time.
 
 I segnali con un numero più basso hanno una priorità maggiore e vengono
 consegnati per primi, inoltre i segnali real-time non possono interrompere
@@ -2450,37 +2448,54 @@ tutti la stessa priorit
 real-time.
 
 Si tenga presente che questi nuovi segnali non sono associati a nessun evento
-specifico (a meno di non utilizzarli, come vedremo in
-\secref{sec:file_asyncronous_io}, per l'I/O asincrono) e devono essere inviati
-esplicitamente. Tutti i segnali real-time restituiscono al gestore, oltre ai
-campi \var{si\_pid} e \var{si\_uid} di \struct{siginfo\_t} una struttura
-\struct{sigval} (riportata in \figref{fig:sig_sigval}) in cui può essere
-restituito al processo un valore o un indirizzo, che costituisce il meccanismo
-con cui il segnale è in grado di inviare una ulteriore informazione al
-processo.
+specifico, a meno di non utilizzarli in meccanismi di notifica come quelli per
+l'I/O asincrono (vedi \secref{sec:file_asyncronous_io}) o per le code di
+messaggi POSIX (vedi \secref{sec:ipc_posix_mq}); pertanto devono essere
+inviati esplicitamente. 
+
+Inoltre per poter usufruire della capacità di restituire dei dati i relativi
+gestori devono essere installati con \func{sigaction} specificando la modalità
+\const{SA\_SIGINFO} che permette di utilizzare la forma estesa
+\var{sa\_sigaction} (vedi \secref{sec:sig_sigaction}).  In questo modo tutti i
+segnali real-time possono restituire al gestore una serie di informazioni
+aggiuntive attraverso l'argomento \struct{siginfo\_t} (la cui definizione è
+riportata in \figref{fig:sig_siginfo_t}).
+
+In particolare i campi utilizzati dai segnali real-time sono \var{si\_pid} e
+\var{si\_uid} in cui vengono memorizzati rispettivamente \acr{pid} e userid
+effettivo del processo che ha inviato il segnale, mentre per la restituzione
+dei dati viene usato il campo \var{si\_value}, questo è una \ctyp{union} di
+tipo \struct{sigval\_t} (la sua definizione è in \figref{fig:sig_sigval}) in
+cui può essere memorizzato o un valore numerico o un indirizzo,\footnote{un
+  campo di tipo \struct{sigval\_t} è presente anche nella struttura
+  \struct{sigevent} che viene usata dai meccanismi di notifica come quelli per
+  l'I/O asincrono (vedi \secref{sec:file_asyncronous_io}) o le code di
+  messaggi POSIX (vedi \secref{sec:ipc_posix_mq}).}
 
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-union sigval {
+union sigval_t {
         int sival_int;
         void *sival_ptr;
 }
     \end{lstlisting}
   \end{minipage} 
   \normalsize 
-  \caption{La struttura \structd{sigval}, usata dai segnali real time per
-    restituire dati al gestore.}
+  \caption{La struttura \structd{sigval\_t}, una \ctyp{union} usata dai
+    segnali real-time e dai meccanismi di notifica per restituire dati al
+    gestore, (in alcune definizione essa viene identificata anche come
+    \code{union sigval}).}
   \label{fig:sig_sigval}
 \end{figure}
 
-A causa di queste loro caratteristiche, la funzione \func{kill} non è adatta
-ad inviare un segnale real time, in quanto non è in grado di fornire alcun
-valore per \struct{sigval}; per questo motivo lo standard ha previsto una
-nuova funzione, \funcd{sigqueue}, il cui prototipo è:
+A causa delle loro caratteristiche, la funzione \func{kill} non è adatta ad
+inviare segnali real-time, poichè non è in grado di fornire alcun valore
+per \struct{sigval\_t}; per questo motivo lo standard ha previsto una nuova
+funzione, \funcd{sigqueue}, il cui prototipo è:
 \begin{prototype}{signal.h}
-  {int sigqueue(pid\_t pid, int signo, const union sigval value)}
+  {int sigqueue(pid\_t pid, int signo, const sigval\_t value)}
   
   Invia il segnale \param{signo} al processo \param{pid}, restituendo al
   gestore il valore \param{value}.
@@ -2506,16 +2521,17 @@ di errore senza inviare nessun segnale.
 
 Se il segnale è bloccato la funzione ritorna immediatamente, se si è
 installato un gestore con \const{SA\_SIGINFO} e ci sono risorse disponibili,
-vale a dire che c'è posto nella coda\footnote{la profondità della coda è
-  indicata dalla costante \const{SIGQUEUE\_MAX}, una della tante costanti di
-  sistema definite dallo standard POSIX, che non abbiamo riportato
-  esplicitamente in \secref{sec:sys_limits}. Il suo valore minimo secondo lo
-  standard, \const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32.}, esso viene inserito
-e diventa pendente; una volta consegnato riporterà nel campo \var{si\_code} di
-\struct{siginfo} il valore \const{SI\_QUEUE} e il campo \var{si\_value}
-riceverà quanto inviato con \param{value}. Se invece si è installato un
-gestore nella forma classica il segnale sarà generato, ma tutte le
-caratteristiche tipiche dei segnali real-time (priorità e coda) saranno perse.
+(vale a dire che c'è posto\footnote{la profondità della coda è indicata dalla
+  costante \const{SIGQUEUE\_MAX}, una della tante costanti di sistema definite
+  dallo standard POSIX, che non abbiamo riportato esplicitamente in
+  \secref{sec:sys_limits}. Il suo valore minimo secondo lo standard,
+  \const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32.} nella coda) esso viene
+inserito e diventa pendente; una volta consegnato riporterà nel campo
+\var{si\_code} di \struct{siginfo} il valore \const{SI\_QUEUE} e il campo
+\var{si\_value} riceverà quanto inviato con \param{value}. Se invece si è
+installato un gestore nella forma classica il segnale sarà generato, ma tutte
+le caratteristiche tipiche dei segnali real-time (priorità e coda) saranno
+perse.
 
 Lo standard POSIX.1b definisce inoltre delle nuove funzioni che permettono di
 gestire l'attesa di segnali specifici su una coda, esse servono in particolar
@@ -2596,7 +2612,6 @@ di timeout nullo, e non ci sono segnali pendenti la funzione ritorner
 immediatamente; in questo modo si può eliminare un segnale dalla coda senza
 dover essere bloccati qualora esso non sia presente.
 
-
 L'uso di queste funzioni è principalmente associato alla gestione dei segnali
 com i thread. In genere esse vengono chiamate dal thread incaricato della
 gestione, che al ritorno della funzione esegue il codice che usualmente
@@ -2607,6 +2622,7 @@ che, per evitare che venga eseguita l'azione predefinita, i segnali gestiti in
 questa maniera devono essere mascherati per tutti i thread, compreso quello
 dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive.
 
+
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"