Segnali real-time completati (forse).
[gapil.git] / signal.tex
index c1b39a83e94929e1e9863da58f42cdc2188a4756..59d28704a94022447e8e29eb4cbcfaba85122781 100644 (file)
@@ -2485,44 +2485,83 @@ 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} viene settata ai valori:
   \begin{errlist}
+  \item[\macro{EINTR}] La funzione è stata interrotta.
   \item[\macro{EINVAL}] Si è specificato un valore non valido per
     \param{set}.
   \end{errlist}
   ed inoltre \macro{EFAULT}.}
 \end{prototype}
 
-
-Altre due funzioni, usate prevalentemente con i thread, sono
-\func{sigwaitinfo} e \func{sigtimedwait}, i loro prototipi sono:
+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 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
+conflitto con gli eventuali manipolatori: pertanto non si deve utilizzare per
+lo stesso segnale questa funzione e \func{sigaction}. Se questo non avviene il
+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
+prevalentemente con i thread; \func{sigwaitinfo} e \func{sigtimedwait}, i
+relativi prototipi sono:
 \begin{functions}
   \headdecl{signal.h}   
 
   \funcdecl{int sigwaitinfo(const sigset\_t *set, siginfo\_t *info)}  
-
-  Attende che uno dei segnali specificati in \param{set} sia pendente.
   
-  \funcdecl{int sigtimedwait(const sigset\_t *set, siginfo\_t *info, const
-    struct timespec *timeout)}
-
-  Attende che uno dei segnali specificati in \param{set} sia pendente.
-
+  Analoga a \func{sigwait}, ma riceve anche le informazioni associate al
+  segnale in \param{info}.
+  
+  \funcdecl{int sigtimedwait(const sigset\_t *set, siginfo\_t *value, const
+    struct timespec *info)}
+  
+  Analoga a \func{sigwaitinfo}, con un la possibilità di specificare un
+  timeout in \param{timeout}.
 
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    errore, nel qual caso \var{errno} viene settata ai valori:
+  
+  \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di
+    errore, nel qual caso \var{errno} viene settata ai valori già visti per
+    \func{sigwait}, ai quali se aggiunge, per \func{sigtimedwait}:
   \begin{errlist}
-  \item[\macro{EINVAL}] Si è specificato un valore non valido per
-  \item[\macro{EAGAIN}] La coda è esarita, ci sono già \macro{SIGQUEUE\_MAX}
-    segnali in attesa si consegna.
-  \item[\macro{EINTR}] Non si hanno privilegi appropriati per inviare il
-    segnale al processo specificato.
-  \item[\macro{ENOSYS}] Il processo \param{pid} non esiste.
+  \item[\macro{EAGAIN}] Si è superato il timeout senza che un segnale atteso
+    fosse emmesso.
   \end{errlist}
-  ed inoltre \macro{EFAULT}.}
+}
 \end{functions}
 
-
-
-
+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 sengali pendenti la funzione ritornerà
+immediatamente; in questo modo si può eliminare un segnale dalla coda senza
+dover essere bloccati qualora esso non sia presente.
+
+
+L'uso di queste funzioni è principalmente associato alla gestione dei segnali
+com i thread. In genere esse vengono chiamate dal thread incaricato della
+gestione, che al ritorno della funzione esegue il codice che usualmente
+sarebbe messo nel manipolatore, per poi ripetere la chiamata per mettersi in
+attesa del segnale successivo. Questo ovviamente comporta che non devono
+essere installati manipolatori, che solo il thread di gestione deve usare
+\func{sigwait} e che, per evitare che venga eseguita l'azione di default, i
+segnali gestiti in questa maniera devono essere mascherati per tutti i thread,
+compreso quello dedicato alla gestione, che potrebbe riceverlo fra due
+chiamate successive.
 
 %%% Local Variables: 
 %%% mode: latex