X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=signal.tex;h=3341dae969d87ab82ed22ce395f45d56de199032;hb=47a00595786c34a03266f19dd5163a45da63e29f;hp=f2dd09b6ee78e523cd774f1e1413deac74f37997;hpb=e7010c3fbd41a2de44c7b513c5de6e2c6d7ab4b4;p=gapil.git diff --git a/signal.tex b/signal.tex index f2dd09b..3341dae 100644 --- a/signal.tex +++ b/signal.tex @@ -390,7 +390,7 @@ momento della ricezione del segnale. \const{SIGTRAP} &SL & C & Trappole per un Trace/breakpoint. \\ \const{SIGURG} &SLB& B & Ricezione di una \textit{urgent condition} su un socket. \\ - \const{SIGVTALRM}&SLB& A & Virtual alarm clock. \\ + \const{SIGVTALRM}&SLB& A & Timer di esecuzione scaduto. \\ \const{SIGXCPU} &SLB& C & Ecceduto il limite sul tempo di CPU. \\ \const{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file. \\ \const{SIGIOT} &L & C & IOT trap. Sinonimo di \const{SIGABRT}. \\ @@ -563,16 +563,17 @@ segnali sono: \subsection{I segnali di allarme} \label{sec:sig_alarm} -Questi segnali sono generati dalla scadenza di un timer. Il loro comportamento -predefinito è quello di causare la terminazione del programma, ma con questi -segnali la scelta predefinita è irrilevante, in quanto il loro uso presuppone -sempre la necessità di un gestore. Questi segnali sono: +Questi segnali sono generati dalla scadenza di un timer (vedi +sez.~\ref{sec:sig_alarm_abort}). Il loro comportamento predefinito è quello di +causare la terminazione del programma, ma con questi segnali la scelta +predefinita è irrilevante, in quanto il loro uso presuppone sempre la +necessità di un gestore. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\const{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente usato dalla funzione \func{alarm}. -\item[\const{SIGVTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al +\item[\const{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal processo. @@ -761,7 +762,7 @@ indicizzate per numero di segnale, per cui una chiamata del tipo di \code{char -\section{La gestione dei segnali} +\section{La gestione di base dei segnali} \label{sec:sig_management} I segnali sono il primo e più classico esempio di eventi asincroni, cioè di @@ -997,9 +998,9 @@ prototipo \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EINVAL}] Il segnale specificato non esiste. - \item[\errcode{ESRCH}] Il processo selezionato non esiste. - \item[\errcode{EPERM}] Non si hanno privilegi sufficienti ad inviare il + \item[\errcode{EINVAL}] il segnale specificato non esiste. + \item[\errcode{ESRCH}] il processo selezionato non esiste. + \item[\errcode{EPERM}] non si hanno privilegi sufficienti ad inviare il segnale. \end{errlist}} \end{functions} @@ -1215,6 +1216,8 @@ significa circa 10~ms). Il sistema assicura comunque che il segnale non sar mai generato prima della scadenza programmata (l'arrotondamento cioè è sempre effettuato per eccesso). +% TODO: verificare cose è successo con l'introduzione nel kernel degli htrimer + Una seconda causa di potenziali ritardi è che il segnale viene generato alla scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo è attivo (questo è sempre vero per \const{ITIMER\_VIRT}) la consegna è @@ -1227,7 +1230,6 @@ in cui un timer scade prima che il segnale di una precedente scadenza sia stato consegnato; in questo caso, per il comportamento dei segnali descritto in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato. - Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il valore corrente di un timer senza modificarlo, è possibile usare la funzione \funcd{getitimer}, il cui prototipo è: @@ -1472,8 +1474,8 @@ tutti gli stati di terminazione sono stati ricevuti. -\section{Gestione avanzata} -\label{sec:sig_control} +\section{La gestione avanzata dei segnali} +\label{sec:sig_adv_control} Le funzioni esaminate finora fanno riferimento alle modalità più elementari della gestione dei segnali; non si sono pertanto ancora prese in @@ -1583,10 +1585,9 @@ relative azioni conseguenti (\texttt{\small 6-11}). Questo è il tipico esempio di caso, già citato in sez.~\ref{sec:proc_race_cond}, in cui si genera una \itindex{race~condition} \textit{race condition}; infatti, in una situazione in cui un segnale è già -arrivato (e \var{flag} è già ad 1) se un altro segnale segnale arriva -immediatamente dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima -della cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà -perduta. +arrivato (e \var{flag} è già ad 1) se un altro segnale arriva immediatamente +dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima della +cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà perduta. Questi esempi ci mostrano che per una gestione effettiva dei segnali occorrono delle funzioni più sofisticate di quelle finora illustrate, queste hanno la @@ -1686,10 +1687,10 @@ da un processo. Il suo prototipo \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido o si è + \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido o si è cercato di installare il gestore per \const{SIGKILL} o \const{SIGSTOP}. - \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi. + \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. \end{errlist}} \end{prototype} @@ -1794,7 +1795,7 @@ tab.~\ref{tab:sig_sa_flag}. % TODO con il 2.6 sono stati aggiunti SA_NOCLDWAIT e altro, documentare Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette -di utilizzare due forme diverse di gestore,\footnote{La possibilità è prevista +di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x con l'introduzione dei segnali real-time (vedi sez.~\ref{sec:sig_real_time}); in precedenza era possibile ottenere alcune @@ -1939,8 +1940,8 @@ pi \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido. - \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi. + \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido. + \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. \end{errlist}} \end{prototype} @@ -2002,8 +2003,8 @@ sospensione del processo lo standard POSIX ha previsto la funzione \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido. - \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi. + \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido. + \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. \end{errlist}} \end{prototype} @@ -2132,10 +2133,10 @@ Installa un nuovo stack per i segnali. errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{ENOMEM}] La dimensione specificata per il nuovo stack è minore + \item[\errcode{ENOMEM}] la dimensione specificata per il nuovo stack è minore di \const{MINSIGSTKSZ}. - \item[\errcode{EPERM}] Uno degli indirizzi non è valido. - \item[\errcode{EFAULT}] Si è cercato di cambiare lo stack alternativo mentre + \item[\errcode{EPERM}] uno degli indirizzi non è valido. + \item[\errcode{EFAULT}] si è cercato di cambiare lo stack alternativo mentre questo è attivo (cioè il processo è in esecuzione su di esso). \item[\errcode{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un valore diverso da zero che non è \const{SS\_DISABLE}. @@ -2314,6 +2315,16 @@ accorgimenti visti in precedenza) il valore di questa variabile tutte le volte che si è rilevata una interruzione dovuta ad un segnale. +\section{Funzionalità avanzate} +\label{sec:sig_real_time} + + +Tratteremo in questa ultima sezione alcune funzionalità avanzate relativa ai +segnali ed in generale ai meccanismi di notifica, a partire dalla funzioni +introdotte per la gestione dei cosiddetti ``\textsl{segnali real-time}'', alla +gestione avanzata delle temporizzazioni e le nuove interfacce per la gestione +di segnali ed eventi attraverso l'uso di filedescriptor. + \subsection{I segnali real-time} \label{sec:sig_real_time} @@ -2428,12 +2439,12 @@ funzione, \funcd{sigqueue}, il cui prototipo \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EAGAIN}] La coda è esaurita, ci sono già \const{SIGQUEUE\_MAX} - segnali in attesa si consegna. - \item[\errcode{EPERM}] Non si hanno privilegi appropriati per inviare il + \item[\errcode{EAGAIN}] la coda è esaurita, ci sono già + \const{SIGQUEUE\_MAX} segnali in attesa si consegna. + \item[\errcode{EPERM}] non si hanno privilegi appropriati per inviare il segnale al processo specificato. - \item[\errcode{ESRCH}] Il processo \param{pid} non esiste. - \item[\errcode{EINVAL}] Si è specificato un valore non valido per + \item[\errcode{ESRCH}] il processo \param{pid} non esiste. + \item[\errcode{EINVAL}] si è specificato un valore non valido per \param{signo}. \end{errlist} ed inoltre \errval{ENOMEM}.} @@ -2473,8 +2484,8 @@ meccanismi di comunicazione elementare; la prima di queste funzioni \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EINTR}] La funzione è stata interrotta. - \item[\errcode{EINVAL}] Si è specificato un valore non valido per + \item[\errcode{EINTR}] la funzione è stata interrotta. + \item[\errcode{EINVAL}] si è specificato un valore non valido per \param{set}. \end{errlist} ed inoltre \errval{EFAULT}.} @@ -2519,7 +2530,7 @@ relativi prototipi sono: errore, nel qual caso \var{errno} assumerà uno dei valori già visti per \func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}: \begin{errlist} - \item[\errcode{EAGAIN}] Si è superato il timeout senza che un segnale atteso + \item[\errcode{EAGAIN}] si è superato il timeout senza che un segnale atteso fosse emesso. \end{errlist} } @@ -2550,6 +2561,24 @@ questa maniera devono essere mascherati per tutti i thread, compreso quello dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive. +\subsection{La gestione avanzata delle temporizzazioni} +\label{sec:sig_timer_adv} + +% TODO trattare i Posix timer, e le fuzioni: +% clock_getres clock_gettime clock_settime (vedi man page) +% timer_getoverrun, timer_gettime, timer_settime, timer_create, timer_delete + + +\subsection{Le interfacce per la notifica attraverso i file descriptor} +\label{sec:sig_signalfd_eventfd} + + +% TODO trattare qui eventfd signalfd e timerfd introdotte con il 2.6.22 +% vedi: http://lwn.net/Articles/233462/ +% http://lwn.net/Articles/245533/ + + + % LocalWords: kernel POSIX timer shell control ctrl kill raise signal handler