X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=11c97f7af7c947e38e18d8faec3437bf2d59cebf;hp=98e476eb52ef57e99ef2390f23b4b12bfd916482;hb=a727c2850d3ac092f165081059cbf1c5d9d9849e;hpb=fc4a31f12206bfd45aedae964058696121e7decf diff --git a/signal.tex b/signal.tex index 98e476e..11c97f7 100644 --- a/signal.tex +++ b/signal.tex @@ -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,15 +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} -Come evidenziato nel paragrafo precedente, le funzioni di gestione dei segnali -dei primi Unix, hanno dei limiti non superabili; per questo motivo lo standard -POSIX ha introdotto una interfaccia di gestione completamente nuova, che -permette un controllo molto più dettagliato. La funzione principale di questa -nuova interfaccia è \func{sigaction}; il cui 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)} @@ -1683,9 +1732,6 @@ struct sigaction { \end{figure} -\subsection{I \textit{signal set}} -\label{sec:sig_sigset} - \subsection{Le funzioni \func{sigpending} e \func{sigsuspend}} \label{sec:sig_sigpending}