X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=de0823f17fe51dc909b681e6eeec760bed399641;hp=ba47d11cd3007013384d2da885d37c6d54038121;hb=83e1d7eba561d29fed7335f4ead2731659f852c8;hpb=fbedaeae01259c00f725deed1ae724a013ab531d;ds=sidebyside 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}