MQ_OVERVIEW(7)

NOM
mq_overview - Vue d'ensemble des files de messages POSIX

DESCRIPTION
Les files de messages POSIX permettent à des processus d'échanger des données sous la forme de message. Cette API est distincte de celle fournie par les files de messages System V (msgget(2), msgsnd(2), msgrcv(2), etc.), mais fournit des fonctionnalités similaires. Les files de messages sont créées et ouvertes avec mq_open(3) ; cette fonction renvoie un descripteur de file de messages (mqd_t), qui sera utilisé pour faire référence à une file de messages ouverte dans des appels ultérieurs. Chaque file de messages est identifiée par un nom de la forme /unnom. Deux processus peuvent agir sur la même file en passant le même nom à mq_open(3). Les messages sont transférés de et vers une file avec respectivement mq_receive(3) et mq_send(3). Lorsqu'un processus a fini d'utiliser une file, il la ferme avec mq_close(3), et lorsque la file n'est plus nécessaire, elle peut être supprimée avec mq_unlink(3). Les attributs peuvent être obtenus et (dans certains cas) modifiés avec mq_getattr(3) et mq_setattr(3). Un processus peut demander une notification asynchrone de l'arrivée d'un message sur une file précédemment vide avec mq_notify(3). Un descripteur de file de messages est une référence à une description de file de messages ouverte (cf. open(2)). Après un fork(2), un fils hérite d'une copie des descripteurs de file de messages du père, et ces descripteurs font référence aux mêmes descriptions de file de messages ouvertes que les descripteurs du père. Les descripteurs correspondants dans les deux processus partagent les attributs (mq_flags) qui sont associés à la description de file de messages ouverte. Chaque message a une priorité priority, associée et les messages sont toujours délivrés au processus récepteur avec la plus forte priorité. Les priorités des messages s'échelonnent de 0 (plus basse) à sysconf(_SC_MQ_PRIO_MAX) - 1 (plus haute). Sous Linux, sysconf(_SC_MQ_PRIO_MAX) renvoie 32768 mais POSIX.1-2001 ne réclame qu'un intevalle de priorité entre 0 et 31 ; certaines implémentations ne fournissent que cet intervalle.

Le reste de cette section décrit certains détails spécifiques à l'implémentation Linux des files de messages POSIX.

  Interfaces bibliothèque et appels système
Dans la plupart des cas, les interfaces bibliothèques mq_*() citées ci-dessus sont implémentées avec les appels système de même nom. Les écarts à ce schéma sont indiqués dans la table suivante :
Interface bibliothèque | Appel système
mq_close(3) | close(2)
mq_getattr(3) | mq_getsetattr(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 sont prises en charge par Linux depuis le noyau 2.6.6. La prise en charge glibc est fournie depuis la version 2.3.4.

  Configuration du noyau
Le support des files de messages POSIX est configurable via l'option de configuration du noyau CONFIG_POSIX_MQUEUE Cette option est active par défaut.

  Persistence
Les files de messages POSIX ont la persistence du noyau : si elle n'est pas supprimée avec mq_unlink(3), une file de messages existera jusqu'à l'arrêt du système.

  Édition de liens
Les programmes utilisant l'API des files de messages doivent être compilés avec cc -lrt pour être liés avec la bibliothèque temps réel librt.

  Interfaces /proc
Les interfaces suivantes peuvent être utilisées pour limiter la mémoire noyau consommée par les files de messages POSIX :

/proc/sys/fs/mqueue/msg_max
    Ce fichier est utilisé pour voir et modifier la valeur plafond du nombre maximal de messages dans une file. Cette valeur agit comme plafond pour l'argument attr->mq_maxmsg fourni à mq_open(3). La valeur par défaut et valeur minimum de msg_max est 10 ; la limite haute est HARD_MAX : (131072 / sizeof(void *)) (32768 sous Linux/86). Cette limite est ignorée par les processus privilègiés (CAP_SYS_RESOURCE), mais le plafond HARD_MAX malgré tout imposé.

/proc/sys/fs/mqueue/msgsize_max
    Ce fichier est utilisé pour voir et modifier la valeur plafond de la taille maximale des messages. Cette valeur agit comme plafond pour l'argument attr->mq_msgsize fourni à mq_open(3). La valeur par défaut et valeur minimum de msgsize_max est 8192 octets ; la limite haute est INT_MAX : (2147483647 sous Linux/86). Cette limite est ignorée par les processus privilègiés. (CAP_SYS_RESOURCE).

/proc/sys/fs/mqueue/queues_max
    Ce fichier est utilisé pour voir et modifier la limite à l'échelle 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 cette limite a été atteinte. La valeur par défaut de queues_max est 256 ; elle peut être modifiée en toute valeur comprise en 0 et INT_MAX.

  Limites resources
La limite ressource RLIMIT_MSGQUEUE, qui place une limite sur la quantité d'espace qui peut être consommée par toutes les files de messages appartenant à un UID réel de 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 sur un système de fichiers virtuel. (D'autres iplémentations peuvent également fournir une telle fonctionnalité mais les détails peuvent différer.) Le système de fichiers peut être monté avec les commandes suivantes :
$ mkdir /dev/mqueue
$ mount -t mqueue none /dev/mqueue
Le sticky bit est automatiquement activé sur le répertoire monté. Après que le système de fichiers ait été monté, les files de messages sur le système de fichiers peuvent être vues et manipulées avec des commandes génralement utilisées pour les fichiers (par exemple, ls(1), rm(1), etc.). Le contenu de chaque fichier du répertoire consiste en une ligne unique d'information sur la file :
$ ls /dev/mqueue/mymq
QSIZE:129     NOTIFY:2    SIGNO:0    NOTIFY_PID:8260
$ mount -t mqueue none /dev/mqueue
Ces champs sont les suivants :

QSIZE
    Nombre d'octets de données dans tous les messages de la file.

NOTIFY_PID
    Si ce champ n'est pas nul, c'est que le processus avec ce PID a utilisé mq_notify(3) pour enregistrer une notification de message asynchrone, et les champs restant décrivent comment les notifications surviennent.

NOTIFY
    Méthode de notification : 0 est SIGEV_SIGNAL , 1 est SIGEV_NONE et 2 est SIGEV_THREAD.

SIGNO
    Numéro de signal pour utiliser avec SIGEV_SIGNAL.

  Scrutation des descripteurs de file de messages
Sous Linux, un descripteur de file de messages est actuellement un descripteur de fichier et peut être surveillé 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 pour l'échange de messages entre processus. Les files de messages POSIX fournissent une interface bien mieux conçue que celles de System V ; d'un autre coté, les files de messages POSIX sont moins largement disponibles (particulièrement sur d'anciens systèmes) que celles de System V.

EXEMPLE
Un exemple de l'utilisation des différentes fonctions de manipulation de files de messages se trouve dans la page mq_notify(3).

VOIR AUSSI
getrlimit(2), mq_getsetattr(2), mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), poll(2), select(2), epoll(7)

TRADUCTION

Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 23 juillet 2006 et révisée le 22 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 7 mq_overview ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.