\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{}
+
+ \bodydesc{ La funzione restituisce 0 in caso di successo e -1 in caso di
+ errore nel qual caso \var{errno} può assumere i valori:
+ \begin{errlist}
+ \item[\macro{EINVAL}] Il segnale specificato non esiste.
+ \item[\macro{ESRCH}] Il processo selezionato non esiste.
+ \item[\macro{EPERM}] Non si hanno privilegi sufficienti ad inviare il
+ segnale.
+ \end{errlist}}
\end{functions}
Lo standard POSIX prevede che il valore 0 per \param{sig} sia usato per
\label{tab:sig_kill_values}
\end{table}
-
Si noti pertanto che la funzione \code{raise(sig)} può essere definita in
termini di \func{kill}, ed è sostanzialmente equivalente ad una
\code{kill(getpid(), sig)}. Siccome \func{raise}, che è definita nello
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.
+gestire gestire il blocco dei segnali o di verificare lo stato dei segnali
+pendenti.
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},
+ha introdotto una interfaccia di gestione completamente nuova, che permette di
+ottenete 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}, come viene
+usualmente chiamato), che è il tipo di dato che viene usato per gestire il
+blocco dei segnali.
+
+In genere un \textit{signal set} è rappresentato da un intero di dimensione
+opportuna, di solito si pari al numero di bit dell'architettura della
+macchina\footnote{nel caso dei PC questo comporta un massimo di 32 segnali
+ distinti, dato che in Linux questi sono sufficienti non c'è necessità di
+ nessuna struttura più complicata}, ciascun bit del quale è associato ad uno
+specifico segnale; in questo modo è di solito possibile implementare le
+operazioni direttamente con istruzioni elementari del processore; 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:
+\func{sigismember}, i cui prototipi sono:
\begin{functions}
\headdecl{signal.h}
\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}.}
+ \bodydesc{Le prime quattro funzioni ritornano 0 in caso di successo, mentre
+ \func{sigismember} ritorna 1 se \param{signum} è in \param{set} e 0
+ altrimenti. In caso di errore tutte ritornano -1, con \var{errno} settata a
+ \macro{EINVAL} (il solo errore possibile è che \param{signum} non sia un
+ segnale valido).}
\end{functions}
+Dato che in generale non si può fare conto sulle caratteristiche di una
+implementazione (non è detto che si disponga di un numero di bit sufficienti
+per mettere tutti i segnali in un intero, o in \type{sigset\_t} possono essere
+immagazzinate ulteriori informazioni) tutte le operazioni devono essere
+comunque eseguite attraverso queste funzioni.
+In genere si usa un \textit{signal set} per specificare quali segnali si vuole
+bloccare, o per riottenere dalle varie funzioni di gestione la maschera dei
+segnali attivi. Essi possono essere definiti in due diverse maniere,
+aggiungendo i segnali voluti ad un insieme vuoto ottenuto con
+\func{sigemptyset} o togliendo quelli che non servono da un insieme completo
+ottenuto con \func{sigfillset}. Infine \func{sigismember} permette di vericare
+la presenza di uno specifico segnale in un \textit{signal set}.
\subsection{La funzione \func{sigaction}}
\label{sec:sig_sigaction}
-
La funzione principale di questa nuova interfaccia è \func{sigaction}; il cui
prototipo è:
+\subsection{La gestione del blocco dei segnali}
+\label{sec:sig_sigmask}
+
+Una delle informazioni che ciascun processo porta con se è l'insieme
+(anch'esso un signal set) dei segnali bloccati (la cosiddetta \textit{signal
+ mask}, mantenuta nel campo \var{blocked} di \var{task\_struct}); abbiamo
+accennato in \secref{sec:proc_fork} che essa viene ereditata da un processo
+
+
\subsection{Le funzioni \func{sigpending} e \func{sigsuspend}}
\label{sec:sig_sigpending}