mq_notify()
permet au processus appelant de s'enregistrer ou se désenregistrer de la
délivrance d'une notification asynchrone lorsqu'un nouveau message arrive
sur une file de messages vide référencée par le descripteur
mqdes.
L'argument
notification
est un pointeur sur une structure
sigevent
difinie de la manière suivante :
union sigval { /* Data passed with notification */
int sival_int; /* Integer value */
void *sival_ptr; /* Pointer value */
};
struct sigevent {
int sigev_notify; /* Notification method */
int sigev_signo; /* Notification signal */
union sigval sigev_value; /* Data passed with notification */
void (*sigev_notify_function) (union sigval);
/* Function for thread notification */
void *sigev_notify_attributes;
/* Thread function attributes */
};
Si
notification
est un pointeur non NULL,
mq_notify()
enregistre le processus appelant afin qu'il reçoive
les notifications de message.
Le champ
sigev_notify
de la structure
sigevent
sur laquelle pointe
notification
indique comment sera réalisée la notification.
Ce champ peut prendre une des valeurs suivantes :
-
- SIGEV_NONE
-
Une notification « nulle » : le processus appelant est enregistré
pour être la cible d'une notification, mais lorsqu'un message arrive,
aucune notification n'est envoyée.
-
- SIGEV_SIGNAL
-
Notifier le processus avec le signal spécifié dans
sigev_signo.
Si le signal est capturé par un gestionnaire de signaux
qui a été enregistré en utilisant l'attribut
SA_SIGINFO
de
sigaction(2)
les champs suivants, de la structure
siginfo_t
passée comme second argument au gestionnaire, seront remplis :
si_code
prend la valeur
SI_MESGQ ;
si_signo
prend le numéro du signal ;
si_value
prend la valeur contenue dans
notification->sigev_value ;
si_pid
prend le PID du processus qui a envoyé le message ;
si_uid
prend l'UID réel du processus qui a envoyé le message.
La même information est disponible si le signal est accepté en utilisant
sigwaitinfo(2).
-
- SIGEV_THREAD
-
Délivrer une notification en invoquant
notification->sigev_thread_function
comme fonction de départ du nouveau thread.
Cette fonction est invoquée avec
notification->sigev_value
comme seul argument.
Si
notification->sigev_notify_attributes
n'est pas NULL, il doit pointer vers une structure
pthread_attr_t
qui définit les attributs du thread.
Un seul processus peut s'enregister
pour revevoir une notification d'une file de messages.
Si
notification
est NULL et que le processus est actuellement enregistré pour recevoir
les notifications de cette file de message, alors l'enregistrement est
supprimé permettant à un autre processus de s'enregistrer pour recevoir
les notifications de cette file.
Une notification de mesage ne survient que lorsqu'un nouveau message
arrive et que la file est vide.
Si la file n'est pas vide au moment où
mq_notify()
est appelé, la notification ne surviendra qu'après que la file
ait été vidée et qu'un nouveau message arrive.
Si un autre processus ou thread est en attente
de lecture de message dans une file vide en utilisant
mq_receive(3),
tout enregistrement de notification de message est ignorée :
le message est délivré au processus ou thread appelant
mq_receive(3),
et l'enregistrement de notification de message reste effectif/
La notification ne survient qu'une seule fois.
Après qu'une notification ait été délivrée,
l'enregistrement de la notification est supprimé.
Un autre processus peut ainsi s'enregistrer pour une notification.
Si le processus notifié souhaite recevoir une nouvelle notification,
il peut utiliser
mq_notify()
pour demander une notification supplémentaire.
Cela devrait être fait avant de vider
tous les messages non lus de la file.
(Placer la file en mode non bloquant est utile pour vider
la file des messages sans qu'elle bloque une fois vide.)