mq_overview(7) Miscellaneous Information Manual mq_overview(7)
NOM
mq_overview - Apercu des files de messages POSIX
DESCRIPTION
Les files de messages POSIX permettent aux processus d'echanger des
donnees 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 fonctionnalites similaires.
Les files de messages sont creees et ouvertes en utilisant mq_open(3).
Cette fonction renvoie un descripteur de file de messages (mqd_t),
utilise pour se referer a la file de messages ouverte dans les
prochains appels. Chaque file de messages est distinguee par son nom
sous la forme /un_nom ; c'est-a-dire un chaine terminee par un
caractere NULL pouvant avoir jusqu'a NAME_MAX caracteres (par exemple,
255), commencant par une barre oblique (<< / >>) suivie d'un caractere
ou plus, aucun de ces derniers n'etant une barre oblique. Deux
processus peuvent operer sur la meme file en fournissant le meme nom a
mq_open(3).
Les messages sont transferes a une file et recuperes 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 necessaire, elle peut etre supprimee avec
mq_unlink(3). Les attributs de la file peuvent etre obtenus et (dans
certains cas) modifies en utilisant mq_getattr(3) et mq_setattr(3). Un
processus peut demander un avertissement asynchrone de l'arrivee d'un
message sur une file auparavant vide en utilisant mq_notify(3).
Un descripteur de file de messages est une reference a une description
d'une file de messages ouverte (consulter open(2)). Apres un appel a
fork(2), un processus enfant herite d'une copie des descripteurs de
file de messages de son parent, et ces descripteurs referent aux memes
descriptions de file de messages ouverte que les descripteurs
correspondants du parent. Les descripteurs correspondants de file de
messages des deux processus partagent les attributs (mq_flags) qui sont
associes a la description de la file de messages ouverte.
Chaque message contient une priorite associee, et les messages sont
toujours delivres au processus de reception par ordre de plus haute
priorite. L'intervalle de priorite des messages va de 0 (faible) a
sysconf(_SC_MQ_PRIO_MAX) - 1 (haute). Sur Linux,
sysconf(_SC_MQ_PRIO_MAX) renvoie 32768, mais POSIX.1-2001 n'exige des
implementations que la prise en charge des priorites allant au moins
de 0 a 31. Certaines implementations ne proposent que cet intervalle.
Le reste de cette section decrit certains details specifiques a
l'implementation Linux des files de messages POSIX.
Interfaces de bibliotheque et appels systeme
Dans la plupart des cas, les interfaces de bibliotheque mq_*() listees
ci-dessus sont implementees au-dessus d'appels systeme sous-jacents du
meme nom. Les exceptions a cette regle sont indiquees dans le tableau
ci-dessous :
Interface de bibliotheque Appel systeme
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 gerees par Linux que depuis le
noyau 2.6.6. La gestion n'a ete ajoutee a la glibc que depuis la
glibc 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 activee
par defaut.
Persistance
Les files de messages POSIX persistent dans le noyau : si une file de
messages n'est pas supprimee avec mq_unlink(3), elle existera jusqu'a
l'extinction du systeme.
Liaison
Les programmes utilisant l'API des files de messages POSIX doivent etre
compiles avec cc -lrt pour etre lies a la bibliotheque temps reel
librt.
/proc interfaces
Les interfaces suivantes peuvent etre utilisees pour limiter la
quantite de memoire du noyau utilisee par les files de messages POSIX
et pour definir les attributs par defaut pour de nouvelles files de
message :
/proc/sys/fs/mqueue/msg_default (depuis Linux 3.5)
Ce fichier definit la valeur utilisee par un nouveau reglage
mq_maxmsg de file quand une file est creee avec un appel a
mq_open(3) ou attr est indique comme NULL. La valeur par defaut
pour ce fichier est 10. Le minimum et le maximum sont comme dans
/proc/sys/fs/mqueue/msg_max. Une nouvelle valeur mq_maxmsg par
defaut de file sera la plus petite valeur entre msg_default et
msg_max. Avant Linux 2.6.28, la valeur par defaut de mq_maxmsg
etait 10. De Linux 2.6.28 jusqu'a Linux 3.4, c'etait la valeur
definie de la limite msg_max.
/proc/sys/fs/mqueue/msg_max
Ce fichier peut etre utilise pour visualiser et changer la
valeur limite pour le nombre maximal de messages dans une file.
Cette valeur agit comme un plafond pour le parametre
attr->mq_maxmsg indique a mq_open(3). La valeur par defaut de
msg_max vaut 10. La valeur minimale est de 1 (10 avant
Linux 2.6.28). La valeur maximale vaut HARD_MSGMAX. La limite
msg_max est ignoree pour les processus privilegies
(CAP_SYS_RESOURCE), mais la limite HARD_MSGMAX reste neanmoins
imposee.
La definition de HARD_MSGMAX a change au cours des versions du
noyau :
- jusqu'a Linux 2.6.32 : 131072 / sizeof(void *)
- Linux 2.6.33 a Linux 3.4 : (32768 * sizeof(void *) / 4)
- depuis Linux 3.5 : 65 536.
/proc/sys/fs/mqueue/msgsize_default (depuis Linux 3.5)
Ce fichier definit la valeur utilisee pour un nouveau reglage de
mq_msgsize de file quand celle-ci est creee par un appel a
mq_open(3) ou attr est indique comme NULL. La valeur par defaut
pour ce fichier est 8192 (octets). Le minimum et le maximum sont
comme dans /proc/sys/fs/mqueue/msgsize_max. Si msgsize_default
excede msgsize_max, une nouvelle valeur par defaut de mq_msgsize
pour la file est plafonnee a la limite msgsize_max. Avant
Linux 2.6.28, la valeur par defaut de mq_msgsize etait 8192. De
Linux 2.6.28 jusqu'a Linux 3.4, elle etait la valeur definie de
la limite msgsize_max.
/proc/sys/fs/mqueue/msgsize_max
Ce fichier peut etre utilise pour visualiser et modifier la
limite de la taille maximale des messages. Cette valeur agit
comme un plafond pour le parametre attr->mq_msgsize indique a
mq_open(3). La valeur par defaut de msgsize_max est de
8192 octets. La valeur minimale est 128 (8192 pour les noyaux
anterieurs a 2.6.28). La valeur maximale pour msg_max a variee
selon les versions du noyau.
- avant Linux 2.6.28, la valeur maximale etait INT_MAX ;
- de Linux 2.6.28 jusqu'a Linux 3.4, la limite etait
1 048 576 ;
- depuis Linux 3.5, la limite est 16 777 216 (HARD_MSGSIZEMAX).
La limite msgsize_max est ignoree pour les processus privilegies
(CAP_SYS_RESOURCE), mais, depuis Linux 3.5, le plafond
HARD_MSGSIZEMAX est impose aux processus privilegies.
/proc/sys/fs/mqueue/queues_max
Ce fichier peut etre utilise pour visualiser et modifier la
limite pour le systeme entier du nombre de files de messages qui
peuvent etre creees. La valeur par defaut de queues_max est 256.
Aucun plafond n'est impose pour la limite queues_max. Les
processus privilegies (CAP_SYS_RESOURCE) peuvent depasser cette
limite (mais voir BOGUES).
Limitation des ressources
La limitation des ressources RLIMIT_MSGQUEUE, qui indique une limite
sur la quantite d'espace qui peut etre utilise par toutes les files de
messages appartenant a l'identifiant utilisateur reel du processus, est
decrite dans getrlimit(2).
Monter le systeme de fichiers des files de messages
Sous Linux, les files de messages sont creees dans un systeme de
fichiers virtuel. (D'autres implementations peuvent egalement fournir
une telle fonctionnalite, mais les details sont probablement
differents.) Ce systeme de fichiers peut etre monte (par le
superutilisateur) en utilisant les commandes suivantes :
# mkdir /dev/mqueue
# mount -t mqueue none /dev/mqueue
Le << sticky bit >> est automatiquement active sur le repertoire de
montage.
Une fois le systeme de fichiers monte, les files de messages sur le
systeme peuvent etre visualisees et manipulees avec les commandes
utilisees habituellement pour les fichiers (par exemple, ls(1) et
rm(1)).
Le contenu de chaque fichier dans le repertoire est compose 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 caracteristiques suivantes :
QSIZE Nombre d'octets de donnees dans tous les messages de la file
(mais voir BOGUES).
NOTIFY_PID
Si different de zero, alors le processus avec cet identifiant a
utilise mq_notify(3) pour s'enregistrer pour les notifications
asynchrones de messages, et les champs suivants decrivent
comment ces notifications se produisent.
NOTIFY Methode de notification : 0 pour SIGEV_SIGNAL, 1 pour SIGEV_NONE
et 2 pour SIGEV_THREAD.
SIGNO Numero de signal a utiliser pour SIGEV_SIGNAL.
Implementation de Linux des descripteurs de files de messages
Sous Linux, un descripteur de file de messages est en fait un
descripteur de fichier (POSIX n'exige pas une telle implementation).
Cela signifie qu'un descripteur de file de messages peut etre controle
avec select(2), poll(2) ou epoll(7). Cela n'est pas portable.
Le drapeau << close-on-exec >> (voir open(2)) est automatiquement
positionne sur le descripteur de fichier renvoye par mq_open(2).
Espaces de noms IPC
Pour une discussion sur l'interaction entre les objets de file de
messages POSIX et les espaces de noms IPC, consulter ipc_namespaces(7).
NOTES
Les files de messages System V (msgget(2), msgsnd(2), msgrcv(2), etc.)
sont une ancienne API d'echange de messages entre les processus. Les
files de messages POSIX fournissent une interface mieux concue.
Cependant, les files de messages POSIX sont moins largement disponibles
(en particulier sur les anciens systemes) que les files de messages
System V.
Actuellement (Linux 2.6.26), Linux ne gere pas l'utilisation des listes
de controle d'acces (ACL : Access Control List) des files de messages
POSIX.
BOGUES
Depuis Linux 3.5 jusqu'a Linux 3.14, le noyau imposait un plafond de
1024 (HARD_QUEUESMAX) pour la valeur a laquelle la limite queues_max
pouvait etre elevee, et ce plafond etait impose meme pour les processus
privilegies. Ce plafond a ete supprime dans Linux 3.14 et des
correctifs pour Linux 3.5.x jusqu'a Linux 3.13.x ont aussi supprime ce
plafond.
Comme originellement implemente (et documente), le champ QSIZE affiche
le nombre total d'octets (fournis par l'utilisateur) dans tous les
messages de la file. Certains changements dans Linux 3.5 ont
malencontreusement modifie ce comportement de facon que ce champ inclut
un compte d'octets d'en-tetes du noyau utilises pour stocker les
messages dans la file. Cette regression comportementale a ete rectifiee
dans Linux 4.2 (et dans les series stables anterieures), de telle facon
que le compte de nouveau n'inclut que les octets de donnees utilisateur
des messages dans la file.
EXEMPLES
Un exemple d'utilisation des differentes 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), namespaces(7)
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-Paul Guillonneau
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.9.1 2 mai 2024 mq_overview(7)