NOM
mq_overview - Panorama des files de messages POSIX
Les files de messages POSIX permettent aux processus d’échanger des
données sous forme de messages. Cette API est distincte de celle
fournie par les files de messages System V (msgget(2), msgsnd(2),
msgrcv(2), etc.), mais propose des fonctionnalités similaires.
Les files de messages sont créées et ouvertes en utilisant mq_open(3).
Cette fonction retourne un descripteur de file de messages (mqd_t),
utilisé pour se référer à la file de messages ouverte dans les
prochains appels. Chaque file de messages est distinguée par son nom
sous la forme /un_nom ; c’est-à-dire un chaîne terminée par un
caractère nul pouvant avoir jusqu’à NAME_MAX (255) caractères,
commençant par une barre oblique (« / ») suivie d’un caractère ou plus,
aucun de ces derniers n’étant une barre oblique. Deux processus peuvent
opérer sur la même file en fournissant le même nom à mq_open(3).
Les messages sont transférés à une file et récupérés depuis une file en
utilisant mq_send(3) et mq_receive(3). Lorsqu’un processus a fini
d’utiliser la file, il la ferme en utilisant mq_close(3), et lorsque
cette file n’est plus nécessaire, elle peut être supprimée avec
mq_unlink(3). Les attributs de la file peuvent être obtenus et (dans
certains cas) modifiés en utilisant mq_getattr(3) et mq_setattr(3). Un
processus peut demander un avertissement asynchrone de l’arrivée d’un
message sur une file auparavant vide en utilisant mq_notify(3).
Un descripteur de file de messages est une référence à une description
dune file de messages ouverte (voyez open(2)). Après un appel à
fork(2), un processus fils hérite des copies des descripteurs de file
de messages de son parent, et ces descripteurs réfèrent aux mêmes
descriptions de files de messages ouvertes que les descripteurs
correspondants du parent. Les descripteurs correspondants de deux
processus partagent l’attribut (mq_flags) qui est associé à la
description de la file de messages ouverte.
Chaque message contient une priorit associée, et les messages sont
toujours délivrés au processus de réception par ordre de priorité.
L’intervalle de priorité des messages va de 0 (faible) à
sysconf(_SC_MQ_PRIO_MAX) - 1 (haute). Sur Linux,
sysconf(_SC_MQ_PRIO_MAX) renvoie 32768, mais POSIX.1-2001 ne demande
qu’une implémentation gérant des priorités allant de 0 à 31. Certaines
implémentations ne proposent que cet intervalle.
Le reste de cette section décrit certains détails spécifiques à
l’implémentation Linux des queues de messages POSIX.
Interfaces de bibliothèque et appels système
Dans la plupart des cas, les interfaces de bibliothèque mq_*() sont
implémentées autour d’appels système du même nom. Les exceptions à
cette règle sont indiquées dans le tableau ci‐dessous :
Fonction de bibliothèque Appel système
mq_close(3) close(2)
mq_getattr(3) mq_getsetattr(2)
mq_notify(3) mq_notify(2)
mq_open(3) mq_open(2)
mq_receive(3) mq_timedreceive(2)
mq_send(3) mq_timedsend(2)
mq_setattr(3) mq_getsetattr(2)
mq_timedreceive(3) mq_timedreceive(2)
mq_timedsend(3) mq_timedsend(2)
mq_unlink(3) mq_unlink(2)
Versions
Les files de messages POSIX ne sont gérées par Linux que depuis le
noyau 2.6.6. La gestion n’a été ajoutée à Glibc que depuis la
version 2.3.4.
Configuration du noyau
La gestion des files de messages POSIX est configurable via l’option de
configuration du noyau CONFIG_POSIX_MQUEUE. Cette option est activée
par défaut.
Persistance
Les files de messages POSIX persistent dans le noyau : si une file de
messages n’est pas supprimée avec mq_unlink(3), elle existera jusqu’à
l’extinction du système.
Édition des liens
Les programmes utilisant l’API des files de messages POSIX doivent être
compilés avec cc -lrt pour être liés à la bibliothèque temps réel
librt.
Interfaces /proc
Les interfaces suivantes peuvent être utilisées pour limiter la
quantité de mémoire du noyau utilisée par les files de messages POSIX :
/proc/sys/fs/mqueue/msg_max
Ce fichier peut être utilisé pour visualiser et changer la
valeur limite pour le nombre maximum de messages dans une file.
Cette valeur agit comme une borne pour le paramètre
attr->mq_maxmsg indiqué à mq_open(3). La valeur par défaut de
msg_max vaut 10. La valeur minimale est de 1 (10 pour les noyaux
antérieurs à 2.6.28). La valeur maximale vaut HARD_MAX :
(131072 / sizeof(void *)) (32768 sur Linux/86). Cette limite est
ignorée pour les processus privilégiés (CAP_SYS_RESOURCE), mais
la limite HARD_MAX reste néanmoins imposée.
/proc/sys/fs/mqueue/msgsize_max
Ce fichier peut être utilisé pour visualiser et modifier la
limite de la taille maximale des messages. Cette valeur agit
comme une borne pour le paramètre attr->mq_msgsize indiqué à
mq_open(3). La valeur par défaut de msgsize_max est de 8192
octets. La valeur minimale est de 128 (8192 pour les noyaux
antérieurs à 2.6.28). La valeur maximale de msgsize_max est de
1 048 576 octets (dans les noyaux antérieurs à 2.6.28, la valeur
maximale était de INT_MAX, c’est-à-dire 2 147 483 647 sur
Linux/86). Cette limite est ignorée pour les processus
privilégiés (CAP_SYS_RESOURCE).
/proc/sys/fs/mqueue/queues_max
Ce fichier peut être utilisé pour visualiser et modifier la
limite au niveau du système du nombre de files de messages qui
peuvent être créées. Seuls les processus privilégiés
(CAP_SYS_RESOURCE) peuvent créer de nouvelles files de messages
une fois que la limite a été atteinte. La valeur par défaut de
queues_max vaut 256, elle peut être remplacée par n’importe
quelle valeur entre 0 et INT_MAX.
Limitation des ressources
La limitation des ressources RLIMIT_MSGQUEUE, qui indique une limite
sur la quantité d’espace qui peut être utilisée par toutes les files de
messages appartenant à l’identifiant utilisateur réel du processus, est
décrite dans getrlimit(2).
Monter le système de fichiers des files de messages
Sous Linux, les files de messages sont créées dans un système de
fichiers virtuel. (D’autres implémentation peuvent également fournir
une telle fonctionnalité, mais les détails sont probablement
différents.) Ce système de fichiers peut être monté (par le
superutilisateur) en utilisant les commandes suivantes :
# mkdir /dev/mqueue
# mount -t mqueue none /dev/mqueue
Le « sticky bit » est automatiquement activé sur le répertoire de
montage.
Une fois le système de fichiers monté, les files de messages sur le
système peuvent être visualisées et manipulées avec les commandes
utilisées habituellement pour les fichiers (par exemple, ls(1) et
rm(1)).
Le contenu de chaque fichier dans le répertoire est composé d’une seule
ligne contenant les informations sur la file :
$ cat /dev/mqueue/mymq
QSIZE:129 NOTIFY:2 SIGNO:0 NOTIFY_PID:8260
Ces champs ont les caractéristiques suivantes :
QSIZE Nombre d’octets de données dans tous les messages de la file.
NOTIFY_PID
Si différent de zéro, alors le processus avec cet identifiant a
utilisé mq_notify(3) pour s’enregistrer pour les avertissements
asynchrones de messages, et les champs suivants décrivent
comment ces avertissements se produisent.
NOTIFY Méthode d’avertissement : 0 pour SIGEV_SIGNAL, 1 pour SIGEV_NONE
et 2 pour SIGEV_THREAD.
SIGNO Numéro de signal à utiliser pour SIGEV_SIGNAL.
Consultation des descripteurs de files de messages
Sous Linux, un descripteur de file de messages est en fait un
descripteur de fichier, et peut être contrôlé avec select(2), poll(2)
ou epoll(7). Ceci n’est pas portable.
CONFORMITÉ
POSIX.1-2001.
NOTES
Les files de messages System V (msgget(2), msgsnd(2), msgrcv(2), etc.)
sont une ancienne API d’échange de messages entre les processus. Les
files de messages POSIX fournissent une interface mieux conçue.
Cependant, les files de messages POSIX sont moins disponibles (en
particulier sur les anciens systèmes) que les files de messages
System V.
Actuellement (2.6.26), Linux ne gère pas l’utilisation des listes de
contrôle d’accès (ACL : Access Control List) des files de messages
POSIX.
EXEMPLE
Un exemple d’utilisation des différentes fonctions des files de
messages est disponible dans mq_notify(3).
VOIR AUSSI
getrlimit(2), mq_getsetattr(2), poll(2), select(2), mq_close(3),
mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3),
mq_unlink(3), epoll(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».