X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=7af26cfd12520ec5fd30acc061098c0a32880872;hp=c755b31229b6395f65475081d7deb89a12d07adf;hb=a801b1a1804866073aad5c25a84893a697a3b3b3;hpb=b8c4894ef54a5cadf759fcc47339b8dd7156dfd3 diff --git a/signal.tex b/signal.tex index c755b31..7af26cf 100644 --- a/signal.tex +++ b/signal.tex @@ -1163,10 +1163,10 @@ che consente effettivamente di inviare un segnale generico ad un processo, il caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EINVAL}] il segnale specificato non esiste. - \item[\errcode{ESRCH}] il processo o il gruppo di processi indicato non - esiste. \item[\errcode{EPERM}] non si hanno privilegi sufficienti ad inviare il segnale. + \item[\errcode{ESRCH}] il processo o il gruppo di processi indicato non + esiste. \end{errlist} } \end{funcproto} @@ -1611,9 +1611,9 @@ favore della nuova funzione di sistema \funcd{nanosleep}, il cui prototipo è: {La funzione ritorna $0$ se l'attesa viene completata e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. \item[\errcode{EINVAL}] si è specificato un numero di secondi negativo o un numero di nanosecondi maggiore di 999.999.999. - \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. \end{errlist} } \end{funcproto} @@ -2020,10 +2020,10 @@ essere gestito da un processo. Il suo prototipo è: {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} + \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido o si è cercato di installare il gestore per \signal{SIGKILL} o \signal{SIGSTOP}. - \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. \end{errlist} } \end{funcproto} @@ -2414,8 +2414,8 @@ funzione di sistema \funcd{sigprocmask}, il cui prototipo è: {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei 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. \end{errlist} } \end{funcproto} @@ -2480,8 +2480,8 @@ sospensione del processo lo standard POSIX ha previsto la funzione di sistema {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei 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. \end{errlist} } \end{funcproto} @@ -2744,11 +2744,12 @@ sez.~\ref{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 per \var{sa\_flags} la modalità \const{SA\_SIGINFO} che permette di utilizzare la -forma estesa \var{sa\_sigaction} (vedi sez.~\ref{sec:sig_sigaction}) del -gestore. In questo modo tutti i segnali \textit{real-time} possono restituire -al gestore una serie di informazioni aggiuntive attraverso l'argomento -\struct{siginfo\_t}, la cui definizione è stata già vista in -fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori in forma estesa. +forma estesa \var{sa\_sigaction} del gestore (vedi +sez.~\ref{sec:sig_sigaction}). In questo modo tutti i segnali +\textit{real-time} possono restituire al gestore una serie di informazioni +aggiuntive attraverso l'argomento \struct{siginfo\_t}, la cui definizione è +stata già vista in fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori +in forma estesa. In particolare i campi utilizzati dai segnali \textit{real-time} sono \var{si\_pid} e \var{si\_uid} in cui vengono memorizzati rispettivamente il @@ -2827,44 +2828,45 @@ segnali \textit{real-time} (priorità e coda) saranno perse. Secondo lo standard POSIX 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 -sez.~\ref{sec:sys_limits}, il suo valore minimo secondo lo standard, +sez.~\ref{sec:sys_limits}. Il suo valore minimo secondo lo standard, \const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux la coda ha una dimensione variabile; fino alla versione 2.6.7 c'era un limite massimo globale che poteva essere impostato come parametro del kernel in -\sysctlfile{kernel/rtsig-max};\footnote{ed il valore predefinito era pari a - 1024.} a partire dal kernel 2.6.8 il valore globale è stato rimosso e -sostituito dalla risorsa \const{RLIMIT\_SIGPENDING} associata al singolo -utente, che può essere modificata con \func{setrlimit} come illustrato in +\sysctlfile{kernel/rtsig-max} ed il valore predefinito era pari a 1024. A +partire dal kernel 2.6.8 il valore globale è stato rimosso e sostituito dalla +risorsa \const{RLIMIT\_SIGPENDING} associata al singolo utente, che può essere +modificata con \func{setrlimit} come illustrato in sez.~\ref{sec:sys_resource_limit}. -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 -modo nel caso dei \itindex{thread} \textit{thread}, in cui si possono usare i -segnali \textit{real-time} come meccanismi di comunicazione elementare; la -prima di queste funzioni è \funcd{sigwait}, il cui prototipo è: -\begin{prototype}{signal.h} - {int sigwait(const sigset\_t *set, int *sig)} - - Attende che uno dei segnali specificati in \param{set} sia pendente. - - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di - errore, nel qual caso \var{errno} assumerà uno dei valori: +Lo standard POSIX.1b definisce inoltre delle nuove funzioni di sistema che +permettono di gestire l'attesa di segnali specifici su una coda, esse servono +in particolar modo nel caso dei \itindex{thread} \textit{thread}, in cui si +possono usare i segnali \textit{real-time} come meccanismi di comunicazione +elementare; la prima di queste è \funcd{sigwait}, il cui prototipo è: + +\begin{funcproto}{ +\fhead{signal.h} +\fdecl{int sigwait(const sigset\_t *set, int *sig)} +\fdesc{Attende la ricezione di un segnale.} +} +{La funzione ritorna $0$ in caso di successo e $-1$ per un 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 - \param{set}. \end{errlist} - ed inoltre \errval{EFAULT}.} -\end{prototype} + ed inoltre \errval{EFAULT} nel suo significato generico.} +\end{funcproto} -La funzione estrae dall'insieme dei segnali pendenti uno qualunque dei segnali -specificati da \param{set}, il cui valore viene restituito in \param{sig}. Se -sono pendenti più segnali, viene estratto quello a priorità più alta (cioè con -il numero più basso). Se, nel caso di segnali \textit{real-time}, c'è più di -un segnale pendente, ne verrà estratto solo uno. Una volta estratto il segnale -non verrà più consegnato, e se era in una coda il suo posto sarà liberato. Se -non c'è nessun segnale pendente il processo viene bloccato fintanto che non ne -arriva uno. +La funzione estrae dall'insieme dei segnali pendenti uno qualunque fra quelli +indicati nel \textit{signal set} specificato in \param{set}, il cui valore +viene restituito nella variabile puntata da \param{sig}. Se sono pendenti più +segnali, viene estratto quello a priorità più alta, cioè quello con il numero +più basso. Se, nel caso di segnali \textit{real-time}, c'è più di un segnale +pendente, ne verrà estratto solo uno. Una volta estratto il segnale non verrà +più consegnato, e se era in una coda il suo posto sarà liberato. Se non c'è +nessun segnale pendente il processo viene bloccato fintanto che non ne arriva +uno. Per un funzionamento corretto la funzione richiede che alla sua chiamata i segnali di \param{set} siano bloccati. In caso contrario si avrebbe un @@ -2874,47 +2876,45 @@ comportamento del sistema è indeterminato: il segnale può sia essere consegnato che essere ricevuto da \func{sigwait}, il tutto in maniera non prevedibile. -Lo standard POSIX.1b definisce altre due funzioni, anch'esse usate +Lo standard POSIX.1b definisce altre due funzioni di sistema, anch'esse usate prevalentemente con i \itindex{thread} \textit{thread}; \funcd{sigwaitinfo} e \funcd{sigtimedwait}, i relativi prototipi sono: -\begin{functions} - \headdecl{signal.h} - \funcdecl{int sigwaitinfo(const sigset\_t *set, siginfo\_t *info)} - - Analoga a \func{sigwait}, ma riceve anche le informazioni associate al - segnale in \param{info}. - - \funcdecl{int sigtimedwait(const sigset\_t *set, siginfo\_t *info, const - struct timespec *timeout)} - - Analoga a \func{sigwaitinfo}, con un la possibilità di specificare un - timeout in \param{timeout}. +\begin{funcproto}{ +\fhead{signal.h} +\fdecl{int sigwaitinfo(const sigset\_t *set, siginfo\_t *info)} +\fdesc{Attende un segnale con le relative informazioni.} +\fdecl{int sigtimedwait(const sigset\_t *set, siginfo\_t *info, const + struct timespec *timeout)} +\fdesc{Attende un segnale con le relative informazioni per un tempo massimo.} +} - - \bodydesc{Le funzioni restituiscono 0 in caso di successo e $-1$ in caso di - errore, nel qual caso \var{errno} assumerà uno dei valori già visti per - \func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}: +{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno gli stessi valori di \func{sigwait} ai quali + si aggiunge per \func{sigtimedwait}: \begin{errlist} \item[\errcode{EAGAIN}] si è superato il timeout senza che un segnale atteso - fosse emesso. + sia stato ricevuto. \end{errlist} } -\end{functions} +\end{funcproto} + Entrambe le funzioni sono estensioni di \func{sigwait}. La prima permette di ricevere, oltre al numero del segnale, anche le informazioni ad esso associate -tramite \param{info}; in particolare viene restituito il numero del segnale -nel campo \var{si\_signo}, la sua causa in \var{si\_code}, e se il segnale è -stato immesso sulla coda con \func{sigqueue}, il valore di ritorno ad esso -associato viene riportato in \var{si\_value}, che altrimenti è indefinito. - -La seconda è identica alla prima ma in più permette di specificare un timeout, -scaduto il quale ritornerà con un errore. Se si specifica un puntatore nullo -il comportamento sarà identico a \func{sigwaitinfo}, se si specifica un tempo -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. +tramite l'argomento \param{info}; in particolare viene restituito il numero +del segnale nel campo \var{si\_signo}, la sua causa in \var{si\_code}, e se il +segnale è stato immesso sulla coda con \func{sigqueue}, il valore di ritorno +ad esso associato viene riportato in \var{si\_value}, che altrimenti è +indefinito. + +La seconda è identica alla prima ma in più permette di specificare un timeout +con l'argomento omonimo, scaduto il quale ritornerà con un errore. Se si +specifica per \param{timeoout} un puntatore nullo il comportamento sarà +identico a \func{sigwaitinfo}. Se si specifica un tempo 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. \itindbeg{thread} @@ -2942,29 +2942,28 @@ Sia le funzioni per la gestione dei tempi viste in sez.~\ref{sec:sys_cpu_times} che quelle per la gestione dei timer di sez.~\ref{sec:sig_alarm_abort} sono state a lungo limitate dalla risoluzione massima dei tempi dell'orologio interno del kernel, che era quella ottenibile -dal timer di sistema che governa lo \textit{scheduler},\footnote{e quindi - limitate dalla frequenza dello stesso che si ricordi, come già illustrato in - sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante - \texttt{HZ}.} i contatori usati per il calcolo dei tempi infatti erano -basati sul numero di \itindex{jiffies} \textit{jiffies} che vengono -incrementati ad ogni \textit{clock tick} del timer di sistema.\footnote{il che - comportava anche, come accennato in sez.~\ref{sec:sig_alarm_abort} per - \func{setitimer}, problemi per il massimo periodo di tempo copribile da - alcuni di questi orologi, come quelli associati al \textit{process time} - almeno fino a quando, con il kernel 2.6.16, non è stato rimosso il limite di - un valore a 32 bit per i \textit{jiffies}.} +dal timer di sistema che governa lo \textit{scheduler}, e quindi limitate +dalla frequenza dello stesso che si ricordi, come già illustrato in +sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante \texttt{HZ}. I +contatori usati per il calcolo dei tempi infatti erano basati sul numero di +\itindex{jiffies} \textit{jiffies} che vengono incrementati ad ogni +\textit{clock tick} del timer di sistema, il che comportava anche, come +accennato in sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per +il massimo periodo di tempo copribile da alcuni di questi orologi, come quelli +associati al \textit{process time} almeno fino a quando, con il kernel 2.6.16, +non è stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}. Nelle architetture moderne però tutti i computer sono dotati di temporizzatori hardware che possono supportare risoluzioni molto elevate, ed in maniera del tutto indipendente dalla frequenza scelta per il timer di sistema che governa -lo \textit{scheduler};\footnote{normalmente si possono ottenere precisioni - fino al microsecondo, andando molto oltre in caso di hardware dedicato.} per -questo lo standard POSIX.1-2001 ha previsto una serie di nuove funzioni -relative a quelli che vengono chiamati ``\textsl{orologi} -\textit{real-time}'', in grado di supportare risoluzioni fino al -nanosecondo. Inoltre le CPU più moderne sono dotate a loro volta di contatori -ad alta definizione che consentono una grande accuratezza nella misura del -tempo da esse dedicato all'esecuzione di un processo. +lo \textit{scheduler}, normalmente si possono ottenere precisioni fino al +microsecondo, andando molto oltre in caso di hardware dedicato. Per questo lo +standard POSIX.1-2001 ha previsto una serie di nuove funzioni relative a +quelli che vengono chiamati ``\textsl{orologi} \textit{real-time}'', in grado +di supportare risoluzioni fino al nanosecondo. Inoltre le CPU più moderne sono +dotate a loro volta di contatori ad alta definizione che consentono una grande +accuratezza nella misura del tempo da esse dedicato all'esecuzione di un +processo. Per usare queste funzionalità ed ottenere risoluzioni temporali più accurate, occorre però un opportuno supporto da parte del kernel, ed i cosiddetti @@ -3040,7 +3039,7 @@ tab.~\ref{tab:sig_timer_clockid_types}. % funzionamento, vedi http://lwn.net/Articles/429595/ % TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME, vedi % http://lwn.net/Articles/429925/ -% TODP: dal 3.0 anche i cosiddetti Posix Alarm Timers, con +% TODO: dal 3.0 anche i cosiddetti Posix Alarm Timers, con % CLOCK_REALTIME_ALARM vedi http://lwn.net/Articles/429925/ Per poter utilizzare queste funzionalità le \acr{glibc} richiedono che la @@ -3074,12 +3073,12 @@ valore per uno degli orologi \textit{real-time} sono \funcd{clock\_settime} e \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: \begin{errlist} + \item[\errcode{EFAULT}] l'indirizzo \param{tp} non è valido. \item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è valido o il relativo orologio \textit{real-time} non è supportato dal sistema. \item[\errcode{EPERM}] non si ha il permesso di impostare l'orologio indicato (solo per \func{clock\_settime}). - \item[\errcode{EFAULT}] l'indirizzo \param{tp} non è valido. \end{errlist} } \end{functions} @@ -3120,9 +3119,9 @@ orologio, la funzione è \funcd{clock\_getres} ed il suo prototipo è: \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: \begin{errlist} + \item[\errcode{EFAULT}] l'indirizzo di \param{res} non è valido. \item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è valido. - \item[\errcode{EFAULT}] l'indirizzo di \param{res} non è valido. \end{errlist} } \end{functions} @@ -3388,11 +3387,11 @@ identificatore, si può attivare o disattivare un allarme (in gergo \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: \begin{errlist} + \item[\errcode{EFAULT}] si è specificato un indirizzo non valido + per \param{new\_value} o \param{old\_value}. \item[\errcode{EINVAL}] all'interno di \param{new\_value.value} si è specificato un tempo negativo o un numero di nanosecondi maggiore di 999999999. - \item[\errcode{EFAULT}] si è specificato un indirizzo non valido - per \param{new\_value} o \param{old\_value}. \end{errlist} } \end{functions} @@ -3510,9 +3509,9 @@ tempo mancante ad una sua eventuale scadenza, si deve utilizzare la funzione \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: \begin{errlist} - \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido. \item[\errcode{EFAULT}] si è specificato un indirizzo non valido per \param{curr\_value}. + \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido. \end{errlist} } \end{functions} @@ -3625,14 +3624,14 @@ Installa un nuovo \textit{stack} per i segnali. errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{ENOMEM}] la dimensione specificata per il nuovo - \textit{stack} è minore di \const{MINSIGSTKSZ}. - \item[\errcode{EPERM}] uno degli indirizzi non è valido. \item[\errcode{EFAULT}] si è cercato di cambiare lo \textit{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}. + \item[\errcode{ENOMEM}] la dimensione specificata per il nuovo + \textit{stack} è minore di \const{MINSIGSTKSZ}. + \item[\errcode{EPERM}] uno degli indirizzi non è valido. \end{errlist}} \end{prototype}