mq_notify(3) Library Functions Manual mq_notify(3) NOM mq_notify - S'enregistrer pour la reception d'une notification de l'arrivee d'un nouveau message BIBLIOTHEQUE Bibliotheque de temps reel (librt, -lrt) SYNOPSIS #include #include /* Definition des constantes SIGEV_* */ int mq_notify(mqd_t mqdes, const struct sigevent *sevp); 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 de file de messages mqdes. The sevp argument is a pointer to a sigevent structure. For the definition and general details of this structure, see sigevent(3type). Si sevp 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 sevp 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 Notify the process by sending the signal specified in sigev_signo. See sigevent(3type) for general details. The si_code field of the siginfo_t structure will be set to SI_MESGQ. In addition, si_pid will be set to the PID of the process that sent the message, and si_uid will be set to the real user ID of the sending process. SIGEV_THREAD Upon message delivery, invoke sigev_notify_function as if it were the start function of a new thread. See sigevent(3type) for details. Seul un processus peut etre enregistre pour recevoir les notifications d'une file de messages. Si sevp 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 RENVOYEE 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 de file de messages specifie dans mqdes n'est pas valable. EBUSY Un autre processus est deja enregistre pour recevoir les notifications de cette file de messages. EINVAL sevp->sigev_notify n'est pas l'une des valeurs permises ; ou sevp->sigev_notify vaut SIGEV_SIGNAL et sevp->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 sevp est NULL et si l'appelant n'a pas souscrit aux notifications de la file mqdes. ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +---------------------------------+--------------------------+---------+ |Interface | Attribut | Valeur | +---------------------------------+--------------------------+---------+ |mq_notify() | Securite des threads | MT-Safe | +---------------------------------+--------------------------+---------+ VERSIONS Differences entre bibliotheque C et noyau Dans l'implementation de la glibc, la fonction de bibliotheque mq_notify() est implementee au-dessus de l'appel systeme du meme nom. Quand sevp est NULL, ou specifie un mecanisme de notification autre que SIGEV_THREAD, la fonction de la bibliotheque invoque directement l'appel systeme. Pour SIGEV_THREAD, l'essentiel de l'implementation reside a l'interieur de la bibliotheque plutot que dans le noyau. (Il en est necessairement ainsi, dans la mesure ou le thread implique dans la gestion de la notification fait partie de ceux qui doivent etre gere par l'implementation de la bibliotheque des threads POSIX de C.) La mise en oeuvre implique l'utilisation d'un socket netlink(7) brut et cree un nouveau thread pour chaque notification delivree au processus. STANDARDS POSIX.1-2008. HISTORIQUE POSIX.1-2001. EXEMPLES 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. Source du programme #include #include #include #include #include #include #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 %zd bytes from MQ\n", nr); free(buf); exit(EXIT_SUCCESS); /* Terminate the process */ } int main(int argc, char *argv[]) { mqd_t mqdes; struct sigevent sev; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } mqdes = mq_open(argv[1], O_RDONLY); if (mqdes == (mqd_t) -1) handle_error("mq_open"); sev.sigev_notify = SIGEV_THREAD; sev.sigev_notify_function = tfunc; sev.sigev_notify_attributes = NULL; sev.sigev_value.sival_ptr = &mqdes; /* Arg. to thread func. */ if (mq_notify(mqdes, &sev) == -1) handle_error("mq_notify"); pause(); /* Process will be terminated by thread function */ } VOIR AUSSI mq_close(3), mq_getattr(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7), sigevent(3type) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 mq_notify(3)