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. L'argument sevp est un pointeur vers une structure sigevent. Pour plus d'informations sur cette structure, consultez 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 Notifier le processus en envoyant le signal specifie dans sigev_signo. Consultez sigevent(3type) 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(3type) pour plus 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. NORMES 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 #include 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) err(EXIT_FAILURE, "mq_getattr"); buf = malloc(attr.mq_msgsize); if (buf == NULL) err(EXIT_FAILURE, "malloc"); nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL); if (nr == -1) err(EXIT_FAILURE, "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) err(EXIT_FAILURE, "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) err(EXIT_FAILURE, "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 . Linux man-pages 6.18 8 fevrier 2026 mq_notify(3)