Messa pure mq_notify
[gapil.git] / ipc.tex
diff --git a/ipc.tex b/ipc.tex
index ba47d11..de0823f 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -4180,6 +4180,56 @@ differenza fra le due funzioni 
 passato il tempo massimo \param{abs\_timeout} ritorna comunque con un errore
 di \errcode{ETIMEDOUT}.
 
+Un'altra caratteristica specifica delle code di messaggi POSIX è la
+possibilità di usufruire di un meccanismo di notifica asincrono; questo può
+essere attivato usando la funzione \funcd{mq\_notify}, il cui prototipo è:
+\begin{prototype}{mqueue.h}
+{int mq\_notify(mqd\_t mqdes, const struct sigevent *notification)}
+
+Attiva il meccanismo di notifica per la coda \param{mqdes}.
+  
+\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+  errore; nel quel caso \var{errno} assumerà i valori: 
+    \begin{errlist}
+    \item[\errcode{EBUSY}] C'è già un processo registrato per la notifica.
+    \item[\errcode{EBADF}] Il descrittore non fa riferimento ad una coda di
+      messaggi.
+    \end{errlist}}
+\end{prototype}
+
+Il meccanismo di notifica permette di segnalare in maniera asincrona ad un
+processo la presenza di dati sulla coda, in modo da evitare la necessità di
+bloccarsi nell'attesa. Per far questo un processo deve registrarsi con la
+funzione \func{mq\_notify}, il meccanismo è disponibile per un solo processo
+alla volta per ogni coda.
+
+Il comportamento di \func{mq\_notify} dipende dal valore dell'argomento
+\param{notification}, che è un puntatore ad una struttura \struct{sigevent}
+(la cui definizione è in \figref{fig:file_sigevent}) che abbiamo già
+incontrato in \secref{sec:file_asyncronous_io}.  Attraverso questa struttura
+si possono impostare le modalità con cui viene effettuata la notifica; in
+particolare il campo \var{sigev\_notify} deve essere posto a
+\const{SIGEV\_SIGNAL}\footnote{il meccanismo di notifica basato sui thread,
+  specificato tramite il valore \const{SIGEV\_THREAD}, non è implementato.} ed
+il campo \var{sigev\_signo} deve indicare il valore del segnale che sarà
+inviato al processo.
+
+La funzione registra il processo chiamante per la notifica se
+\param{notification} punta ad una struttura \struct{sigevent} opportunamente
+inizializzata, o cancella una precedente registrazione se è \val{NULL}. Dato
+che un solo processo alla volta può essere registrato, la funzione fallisce
+con \errcode{EBUSY} se c'è un altro processo già registrato.
+
+La notifica avviene all'arrivo di un messaggio in una coda vuota (e non se ci
+sono messaggi sulla coda), in tal caso il segnale specificato da
+\code{notification->sigev\_signo} viene inviato al processo che si era
+registrato, e la coda diventa disponibile per una ulteriore registrazione. Si
+tenga presente però che la presenza di un processo bloccato in una chiamata a
+\func{mq\_receive} ha la precedenza sulla notifica; in tal caso infatti un
+enventuale messaggio viene immediatamente inviato a quest'ultimo, e per il
+meccanismo di notifica funziona tutto come se la coda fosse restata vuota.
+
+
 
 
 \subsection{Semafori}