Ordinamento alfabetico degli errori ed un po' di revisione
[gapil.git] / signal.tex
index c755b31229b6395f65475081d7deb89a12d07adf..7af26cfd12520ec5fd30acc061098c0a32880872 100644 (file)
@@ -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}