Man page - mq_notify(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

mq_notify

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
VERSIONS
Différences entre bibliothÚque C et noyau
STANDARDS
HISTORIQUE
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

mq_notify - S’enregistrer pour la rĂ©ception d’une notification de l’arrivĂ©e d’un nouveau message

BIBLIOTHÈQUE

BibliothÚque de temps réel ( librt , -lrt )

SYNOPSIS

#include <mqueue.h>
#include <signal.h>
/* Définition des constantes SIGEV_* */

int mq_notify(mqd_t mqdes , const struct sigevent * sevp );

DESCRIPTION

mq_notify () permet Ă  un processus appelant de s’enregistrer ou de ne plus s’enregistrer pour dĂ©livrer une notification asynchrone lorsqu’un message entre dans une file de messages vide rĂ©fĂ©rencĂ©e 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 spĂ©cifie comment la notification est rĂ©alisĂ©e. Ce champ possĂšde l’une des valeurs suivantes :
SIGEV_NONE

Une notification « null » : le processus appelant est enregistrĂ© comme destinataire des notifications, mais aucune notification n’est envoyĂ©e lorsqu’un message arrive.

SIGEV_SIGNAL

Notifier le processus en envoyant le signal spĂ©cifiĂ© dans sigev_signo . Consultez sigevent (3type) pour plus de dĂ©tails. Le champ si_code de la structure siginfo_t sera dĂ©fini Ă  SI_MESGQ . De plus, si_pid sera dĂ©fini au PID du processus qui envoie le message, et si_uid sera dĂ©fini Ă  l’ID utilisateur du processus Ă©metteur.

SIGEV_THREAD

Jusqu’à la livraison du message, invoquer sigev_notify_function comme si c’était la fonction de crĂ©ation d’un nouveau processus lĂ©ger. Consultez sigevent (3type) pour plus dĂ©tails.

Seul un processus peut ĂȘtre enregistrĂ© pour recevoir les notifications d’une file de messages.

Si sevp est NULL, et si le processus appelant est actuellement enregistrĂ© pour recevoir des notifications de cette file de messages, alors l’enregistrement est supprimé ; un autre processus peut 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 Ă  ce moment, mq_notify () est appelĂ©e, alors une notification sera créée aprĂšs que la file est vidĂ©e 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 ignoré : le message est dĂ©livrĂ© au processus ou au thread appelant avec mq_receive (3) et l’enregistrement de notification de message garde son effet.

Une notification apparaĂźt une seule fois : aprĂšs qu’une notification est dĂ©livrĂ©e, l’enregistrement de notification est supprimĂ© et d’autre processus peuvent s’enregistrer. Si le processus notifiĂ© souhaite recevoir la prochaine notification, il peut utiliser mq_notify () pour demander une autre notification. Cela doit ĂȘtre 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ÉE

Si elle rĂ©ussit, la fonction mq_notify () renvoie 0 . En cas d’erreur, elle renvoie -1 et dĂ©finit errno en consĂ©quence.

ERREURS

EBADF

Le descripteur de file de messages spĂ©cifiĂ© dans mqdes n’est pas valable.

EBUSY

Un autre processus est déjà enregistré 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 numĂ©ro de signal valable.

ENOMEM

Mémoire insuffisante.

POSIX.1-2008 dit qu’une implĂ©mentation pourrait gĂ©nĂ©rer 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 utilisés dans cette section, consulter attributes (7).

Image grohtml-3863917-1.png

VERSIONS

Différences entre bibliothÚque C et noyau

Dans l’implĂ©mentation de la glibc, la fonction de bibliothĂšque mq_notify () est implĂ©mentĂ©e au-dessus de l’appel systĂšme du mĂȘme nom. Quand sevp est NULL, ou spĂ©cifie un mĂ©canisme de notification autre que SIGEV_THREAD , la fonction de la bibliothĂšque invoque directement l’appel systĂšme. Pour SIGEV_THREAD , l’essentiel de l’implĂ©mentation rĂ©side Ă  l’intĂ©rieur de la bibliothĂšque plutĂŽt que dans le noyau. (Il en est nĂ©cessairement ainsi, dans la mesure oĂč le thread impliquĂ© dans la gestion de la notification fait partie de ceux qui doivent ĂȘtre gĂ©rĂ© par l’implĂ©mentation de la bibliothĂšque des threads POSIX de C.) La mise en Ɠuvre implique l’utilisation d’un socket netlink (7) brut et crĂ©e un nouveau thread pour chaque notification dĂ©livrĂ©e au processus.

STANDARDS

POSIX.1-2008.

HISTORIQUE

POSIX.1-2001.

EXEMPLES

Le programme suivant enregistre une requĂȘte de notification pour une file de messages nommĂ©e avec l’un des arguments de la ligne de commande. La notification est rĂ©alisĂ©e en crĂ©ant un thread. Le thread exĂ©cute une fonction qui lit un message provenant de la file puis le processus se termine.

Source du programme

#include <mqueue.h>
#include <pthread.h>
#include <signal.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);
/* Déterminer la taille max. du msg ; allouer un tampon
pour recevoir le 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); /* Terminer le processus */
}
int
main(int argc, char *argv[])
{
mqd_t mqdes;
struct sigevent sev;
if (argc != 2) {
fprintf(stderr, "Utilisation : %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");
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(); /* Le processus sera terminé 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 (3type)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .