#include <mqueue.h> mqd_t mq_notify(mqd_t mqdes, const struct sigevent *notification);
Utilisez -lrt à l'édition de liens.
L'argument notification est un pointeur vers une structure sigevent définie 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 :
Un seul processus peut être enregistré pour revevoir les notifications d'une file de messages.
Si notification est NULL et si le processus appelant est actuellement enregistré pour recevoir les notifications de cette file de messages, alors l'enregistrement est supprimé permettant à un autre processus de s'enregistrer pour recevoir les notifications de cette file.
Une notification de message n'est créée 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ée, la notification ne sera créée 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é : le message est délivré au processus ou thread appelant mq_receive(3), et l'enregistrement de notification de message reste effectif.
Une 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.)
#include <pthread.h> #include <mqueue.h> #include <assert.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; assert(argc == 2); 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(); /* Process will be terminated by thread function */ }
Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 23 juillet 2006 et révisée le 17 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 3 mq_notify ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Dernière mise à jour : 17 juillet 2008