Provided by:
manpages-fr-dev_3.27fr1.4-1_all 
NOM
mq_notify - S'enregistrer pour la reception d'une notification de
l'arrivee d'un nouveau message
SYNOPSIS
#include <mqueue.h>
int mq_notify(mqd_t mqdes, const struct sigevent *notification);
Effectuez l'edition des liens avec l'option -lrt.
DESCRIPTION
mq_notify() permet a un processus appelant de s'enregistrer ou de ne
plus s'enregistrer pour delivrer une notification asynchrone lorsqu'un
message entre dans une file de messages vide referencee par le
descripteur mqdes.
L'argument notification est un pointeur vers une structure sigevent.
Pour plus d'informations sur cette structure, consultez sigevent(7).
Si notification est un pointeur non NULL, alors mq_notify() enregistre
le processus appelant afin de recevoir les notifications. Le champ
sigev_notify de sigevent qui pointe vers notification specifie comment
la notification est realisee. Ce champ possede l'une des valeurs
suivantes :
SIGEV_NONE
Une notification << null >> : le processus appelant est
enregistre comme destinataire des notifications, mais aucune
notification n'est envoyee lorsqu'un message arrive.
SIGEV_SIGNAL
Notifier le processus en envoyant le signal specifie dans
sigev_signo. Consultez sigevent(7) pour plus de details. Le
champ si_code de la structure siginfo_t sera defini a SI_MESGQ.
De plus, si_pid sera defini au PID du processus qui envoie le
message, et si_uid sera defini a l'ID utilisateur du processus
emetteur.
SIGEV_THREAD
Jusqu'a la livraison du message, invoquer sigev_notify_function
comme si c'etait la fonction de creation d'un nouveau processus
leger. Consultez sigevent(7) pour plus details.
Seul un processus peut etre enregistre pour recevoir les notifications
d'une file de messages.
Si notification est NULL, et si le processus appelant est actuellement
enregistre pour recevoir des notifications de cette file de messages,
alors l'enregistrement est supprime ; un autre processus peut
s'enregistrer pour recevoir les notifications de cette file.
Une notification de message n'est creee que lorsqu'un nouveau message
arrive et que la file est vide. Si la file n'est pas vide a ce moment,
mq_notify() est appelee, alors une notification sera creee apres que la
file est videe et qu'un nouveau message arrive.
Si un autre processus ou thread attend pour lire un message d'une file
vide avec mq_receive(3), alors tout enregistrement de notification de
message est ignore : le message est delivre au processus ou au thread
appelant avec mq_receive(3) et l'enregistrement de notification de
message garde son effet.
Une notification apparait une seule fois : apres qu'une notification
est delivree, l'enregistrement de notification est supprime et d'autre
processus peuvent s'enregistrer. Si le processus notifie souhaite
recevoir la prochaine notification, il peut utiliser mq_notify() pour
demander une autre notification. Cela doit etre fait avant de vider
tous les messages non lus de la file (Placer la file en mode non
bloquant est utile pour la vider sans la bloquer une seule fois si elle
est vide).
VALEUR RENVOY'EE
Si elle reussit, la fonction mq_notify() renvoie 0. En cas d'erreur,
elle renvoie -1 et definit errno en consequence.
ERREURS
EBADF Le descripteur specifie dans mqdes n'est pas valable.
EBUSY Un autre processus est deja enregistre pour recevoir les
notifications de cette file de messages.
EINVAL notification->sigev_notify n'est pas l'une des valeurs
permises ; ou notification->sigev_notify vaut SIGEV_SIGNAL et
notification->sigev_signo n'est pas un numero de signal valable.
ENOMEM Memoire insuffisante.
POSIX.1-2008 dit qu'une implementation pourrait generer une erreur
EINVAL si notification est NULL et si l'appelant n'a pas souscrit aux
notifications de la file mqdes.
CONFORMIT'E
POSIX.1-2001.
EXEMPLE
Le programme suivant enregistre une requete de notification pour une
file de messages nommee avec l'un des arguments de la ligne de
commande. La notification est realisee en creant un thread. Le thread
execute une fonction qui lit un message provenant de la file puis le
processus se termine.
#include <pthread.h>
#include <mqueue.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
static void /* Thread start function */
tfunc(union sigval sv)
{
struct mq_attr attr;
ssize_t nr;
void *buf;
mqd_t mqdes = *((mqd_t *) sv.sival_ptr);
/* Determine max. msg size; allocate buffer to receive msg */
if (mq_getattr(mqdes, &attr) == -1)
handle_error("mq_getattr");
buf = malloc(attr.mq_msgsize);
if (buf == NULL)
handle_error("malloc");
nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL);
if (nr == -1)
handle_error("mq_receive");
printf("Read %ld bytes from MQ\n", (long) nr);
free(buf);
exit(EXIT_SUCCESS); /* Terminate the process */
}
int
main(int argc, char *argv[])
{
mqd_t mqdes;
struct sigevent not;
if (argc != 2) {
fprintf(stderr, "Usage: %s <mq-name>\n", argv[0]);
exit(EXIT_FAILURE);
}
mqdes = mq_open(argv[1], O_RDONLY);
if (mqdes == (mqd_t) -1)
handle_error("mq_open");
not.sigev_notify = SIGEV_THREAD;
not.sigev_notify_function = tfunc;
not.sigev_notify_attributes = NULL;
not.sigev_value.sival_ptr = &mqdes; /* Arg. to thread func. */
if (mq_notify(mqdes, ¬) == -1)
handle_error("mq_notify");
pause(); /* Le processus sera termine par la fonction du proc. */
}
VOIR AUSSI
mq_close(3), mq_getattr(3), mq_open(3), mq_receive(3), mq_send(3),
mq_unlink(3), mq_overview(7), sigevent(7)
COLOPHON
Cette page fait partie de la publication 3.27 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003),
Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Florentin
Duneau et l'equipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.