Un po' di aggiunte sui signal set
[gapil.git] / signal.tex
index 940b921157b4a58fa89d7b1a09fc2931fc30dccf..11c97f7af7c947e38e18d8faec3437bf2d59cebf 100644 (file)
@@ -883,11 +883,11 @@ con il precedente prototipo si pu
 \begin{verbatim}
     typedef void (* sighandler_t)(int) 
 \end{verbatim}
-e cioè un puntatore ad una funzione \type{void} (cioè senza valore di ritorno)
-e che prende un argomento di tipo \type{int}.\footnote{si devono usare le
+e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno)
+e che prende un argomento di tipo \ctyp{int}.\footnote{si devono usare le
   parentesi intorno al nome della funzione per via delle precedenze degli
   operatori del C, senza di esse si sarebbe definita una funzione che ritorna
-  un puntatore a \type{void} e non un puntatore ad una funzione \type{void}.}
+  un puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}.}
 La funzione \func{signal} quindi restituisce e prende come secondo argomento
 un puntatore a una funzione di questo tipo, che è appunto il manipolatore del
 segnale.
@@ -957,6 +957,9 @@ la funzione \func{kill}; il cui prototipo 
   \headdecl{signal.h}
   \funcdecl{int kill(pid\_t pid, int sig)} Invia il segnale \param{sig} al
   processo specificato con \param{pid}.
+
+  La funzione restituisce 0 in caso di successo e -1 in caso di errore nel
+  qual caso \func{}
 \end{functions}
 
 Lo standard POSIX prevede che il valore 0 per \param{sig} sia usato per
@@ -1617,16 +1620,61 @@ motivo che occorrono funzioni pi
 permettano di gestire i segnali in maniera più completa.
 
 
+\subsection{I \textit{signal set}}
+\label{sec:sig_sigset}
+
+Come evidenziato nel paragrafo precedente, le funzioni di gestione dei segnali
+dei primi Unix, nate con la semantica inaffidabile, hanno dei limiti non
+superabili; in particolare non è prevista nessuna funzione che permetta di
+gestire correttamente i segnali pendenti e bloccati. 
+
+Per questo motivo lo standard POSIX, insieme alla nuova semantica dei segnali
+ha introdotto una interfaccia di gestione completamente nuova, che permette un
+controllo molto più dettagliato. In particolare lo standard ha introdotto un
+nuovo tipo di dato \type{sigset\_t}, che permette di rappresentare un insieme
+di segnali (un \textit{signal set} appunto), in modo da poterlo opportunamente
+manipolare.
+
+In genere il \textit{signal set} è rappresentato da un intero di dimensione
+opportuna (di solito pari al numero di bit dell'architettura della macchina,
+cosa che nel caso dei PC comporta un massimo di 32 segnali distinti), ciascun
+bit del quale è associato ad uno specifico segnale; lo standard POSIX
+definisce cinque funzioni per la manipolazione dei \textit{signal set},
+\func{sigemptyset}, \func{sigfillset}, \func{sigaddset}, \func{sigdelset} e
+\func{sigismember}; i relativi prototipi sono:
+\begin{functions}
+  \headdecl{signal.h} 
+
+  \funcdecl{int sigemptyset(sigset\_t *set)} Inizializza un \textit{signal set}
+  vuoto.
+  \funcdecl{int sigfillset(sigset\_t *set)} Inizializza un \textit{signal set}
+  pieno (con tutti i segnali).
+  
+  \funcdecl{int sigaddset(sigset\_t *set, int signum)} Aggiunge il segnale
+  \param{signum} al  \textit{signal set} \param{set}.
+
+  \funcdecl{int sigdelset(sigset\_t *set, int signum)} Toglie il segnale
+  \param{signum} dal \textit{signal set} \param{set}.
+  
+  \funcdecl{int sigismember(const sigset\_t *set, int signum)} Controlla se il
+  segnale \param{signum} è nel \textit{signal set} \param{set}
+  
+  \bodydesc{Le funzioni prime quattro funzioni ritornano 0, \func{sigismember}
+    ritorna 1 se \param{signum} è in \param{set} e 0 altrimenti, in caso di
+    errore, dovuto al fatto che \param{signum} non è un segnale valido, tutte
+    ritornano -1, con \var{errno} settata a \macro{EINVAL}.}
+\end{functions}
+
+
+
 
 \subsection{La funzione \func{sigaction}}
 \label{sec:sig_sigaction}
 
-Per i limiti che hanno le funzioni originarie dei primi Unix nella gestione
-dei segnali, evidenziati al paragrafo precedente, lo standard POSIX ha
-introdotto una interfaccia di gestione completamente diversa, che prevede
-tutta una serie di nuove funzioni la principale delle quali è
-\func{sigaction}, che lo standard raccomanda come sostituta di \func{signal}
-(che da essa infatti può essere ottenuta); il suo prototipo è:
+
+La funzione principale di questa nuova interfaccia è \func{sigaction}; il cui
+prototipo è:
 
 \begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction
     *act, struct sigaction *oldact)} 
@@ -1637,13 +1685,34 @@ tutta una serie di nuove funzioni la principale delle quali 
     errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
   \item[\macro{EINVAL}] Si è specificato un numero di segnale invalido o si è
-  cercato di installare il manipolatore per \macro{SIGKILL} o \macro{SIGSTOP}.
-\item[\macro{EFAULT}] Si sono specificati indirizzi non validi.
+    cercato di installare il manipolatore per \macro{SIGKILL} o
+    \macro{SIGSTOP}.
+  \item[\macro{EFAULT}] Si sono specificati indirizzi non validi.
   \end{errlist}}
 \end{prototype}
 
-La struttura \var{sigaction} è anch'essa definita dallo standard POSIX, che
-prevede abbia la forma: 
+La funzione serve ad installare una nuova azione per il segnale
+\param{signum}; si parla di azione e non di manipolatore come nel caso di
+\func{signal}, in quanto la funzione consente di specificare le varie
+caratteristiche della risposta al segnale, non solo la funzione del
+manipolatore.  Lo standard POSIX raccomanda di usare sempre questa funzione al
+posto di \func{signal} (che in genere viene definita tramite essa), in quanto
+offre un controllo completo, sia pure al prezzo di una maggiore complessità
+d'uso.
+
+Se il puntatore \param{act} non è nullo la funzione installa la nuova azione
+da esso specificata, se \param{oldact} non è nullo il valore dell'azione
+corrente viene restituito indietro.  Questo permette (specificando \param{act}
+nullo e \param{oldact} non nullo) di superare uno dei limiti di \func{signal},
+che non consente di ottenere l'azione corrente senza installarne una nuova.
+
+Entrambi i puntatori fanno riferimento alla struttura \var{sigaction}, che
+permette di descrivere tutte le caratteristiche dell'azione associata ad un
+segnale.  Anch'essa è descritta dallo standard POSIX ed in Linux è definita
+secondo quanto riportato in \secref{fig:sig_sigaction}, il campo
+\var{sa\_restorer}, non previsto dallo standard, è obsoleto e non deve essere
+più usato.
+
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
@@ -1664,7 +1733,7 @@ struct sigaction {
 
 
 
-\subsection{Le funzioni \func{sigprocmask} e \func{sigpending}}
+\subsection{Le funzioni \func{sigpending} e \func{sigsuspend}}
 \label{sec:sig_sigpending}
 
 
@@ -1675,8 +1744,6 @@ struct sigaction {
 \label{sec:sig_reentrant}
 
 
-, affrontando inoltre le varie problematiche di programmazione che si devono
-tenere presenti quando si ha a che fare con essi.