Provided by: manpages-fr-dev_3.27fr1.4-1_all bug

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, &not) == -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> >>.