From: Simone Piccardi Date: Tue, 4 Feb 2003 18:50:08 +0000 (+0000) Subject: Messa pure mq_notify X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=83e1d7eba561d29fed7335f4ead2731659f852c8;p=gapil.git Messa pure mq_notify --- diff --git a/ipc.tex b/ipc.tex index ba47d11..de0823f 100644 --- 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}