mq_open - Ouvrir une file de messages
Bibliothèque de temps réel (
librt,
-lrt)
#include <fcntl.h> /* Pour les constantes O_* */
#include <sys/stat.h> /* Pour les constantes des modes */
#include <mqueue.h>
mqd_t mq_open(const char *nom, int oflag);
mqd_t mq_open(const char *nom, int oflag, mode_t mode,
struct mq_attr *attr);
La fonction
mq_open() crée une nouvelle file de messages POSIX, ou
ouvre une file de messages existante. La file est identifiée par
nom. Pour plus de détails sur la construction de
nom,
consulter
mq_overview(7).
L'argument
oflag spécifie les drapeaux qui contrôlent
l'opération d'appel (les définitions des valeurs des attributs
peuvent être obtenues en incluant
<fcntl.h>). Un unique
drapeau parmi les suivants doit être spécifié dans
oflag :
- O_RDONLY
- Ouvrir une file pour seulement recevoir des messages.
- O_WRONLY
- Ouvrir une file pour seulement envoyer des messages.
- O_RDWR
- Ouvrir une file pour soit envoyer, soit recevoir des
messages.
Zéro ou plusieurs des drapeaux suivants peuvent être
ajoutés avec un
ou binaire dans
oflag :
-
O_CLOEXEC (depuis Linux 2.6.26)
- Régler le drapeau
« close-on-exec » pour le descripteur de file
de messages. Consulter open(2) pour une discussion sur
l'utilité de ce drapeau.
- O_CREAT
- Créer la file de messages si elle n'existe pas. Le
propriétaire de la file de messages est défini à
l'UID du processus appelant, il en est de même pour le GID.
- O_EXCL
- Si O_CREAT est spécifié dans
oflag, et si une file de nom name existe déjà,
alors elle échouera et renverra le code d'erreur
EEXIST.
- O_NONBLOCK
- Ouvrir une file en mode non bloquant. Dans de telles
circonstances où mq_receive(3) et mq_send(3)
devraient être normalement bloquantes, ces fonctions
échoueront avec le code d'erreur EAGAIN.
Si
O_CREAT est spécifié dans
oflag, alors deux
arguments additionnels doivent être spécifiés. L'argument
mode spécifie les permissions de la nouvelle file, comme pour
open(2) (les définitions symboliques des bits de permissions
peuvent être obtenues en incluant
<sys/stat.h>). La
définition des permissions est masquée avec
l'« umask » du processus.
Les champs des
struct mq_attr pointés vers
attr
spécifient le nombre maximal de messages et la taille maximale des
messages que la file permettra. Cette structure est définie comme
suit :
struct mq_attr {
long mq_flags; /* Drapeaux (ignoré pour mq_open()) */
long mq_maxmsg; /* Max. # de messages dans la file */
long mq_msgsize; /* Max de la taille du message (octets) */
long mq_curmsgs; /* # de messages actuellement dans la file */
(ignoré pour mq_open()) */
};
Seuls les champs
mq_maxmsg et
mq_msgsize sont employés lors
de l'appel de
mq_open() ; les valeurs dans les champs restants
sont ignorées.
Si
attr est NULL, alors la file est créée avec les
attributs par défaut définis par l'implémentation. Depuis
Linux 3.5, deux fichiers de
/proc peuvent être
utilisés pour contrôler ces valeurs par défaut ;
consulter
mq_overview(7) pour plus de détails.
En cas de succès,
mq_open() renvoie un descripteur de file de
messages à utiliser avec les autres fonctions des files de messages. En
cas d'erreur,
mq_open() renvoie
(mqd_t) -1, avec
errno définie.
- EACCES
- La file existe mais l'appelant n'a pas les permissions pour
l'ouvrir dans le mode spécifié.
- EACCES
-
name contient plus d'un caratère
« / ».
- EEXIST
-
O_CREAT et O_EXCL sont
spécifiés dans oflag, mais une file avec le
même nom existe déjà.
- EINVAL
-
nom ne suit pas le format de
mq_overview(7).
- EINVAL
-
O_CREAT était spécifié dans
oflag, et attr était non NULL, mais
attr->mq_maxmsg ou attr->mq_msqsize n'était pas
valable. Ces deux champs doivent être supérieurs à
zéro. Avec un processus non privilégié (qui n'a pas
la capacité CAP_SYS_RESOURCE), attr->mq_maxmsg
doit être inférieur ou égal à la limite
msg_max, et attr->mq_msgsize doit être
inférieur ou égal à la limite msgsize_max. En
plus, même avec un processus privilégié,
attr->mq_maxmsg ne peut pas être plus grand que la limite
HARD_MAX. Consulter mq_overview(7) pour les détails
sur ces limites.
- EMFILE
- La limite par processus du nombre de fichiers ouverts et de
descripteurs de file de messages a été atteinte (voir la
description de RLIMIT_NOFILE dans getrlimit(2)).
- ENAMETOOLONG
-
nom est trop long.
- ENFILE
- La limite à l'échelle du système du
nombre total de fichiers ouverts et de files de messages a
été atteinte.
- ENOENT
- Le drapeau O_CREAT n'a pas été
spécifié dans oflag, et aucune file avec le nom
name n'existe.
- ENOENT
-
name est juste « / »
suivi d'aucun autre caractère.
- ENOMEM
- Mémoire insuffisante.
- ENOSPC
- Pas assez d'espace pour la création de la nouvelle
file de messages. Ceci s'est probablement produit car la limite
queues_max a été atteinte ; consulter
mq_overview(7).
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
mq_open() |
Sécurité des threads |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
La fonction de bibliothèque
mq_open() est
implémentée au-dessus de l'appel système du même
nom. Elle réalise la vérification que le
nom commence par
une barre oblique (/), produisant une erreur
EINVAL si ce n'est pas le
cas. L'appel système du noyau s'attend à ce que le
nom ne
contienne pas de barre oblique initiale, aussi la fonction de
bibliothèque C transmet le
nom sans la barre oblique
initiale (par exemple,
name+1) à l'appel système.'
Avant Linux 2.6.14, l'« umask » du processus
n'est pas appliqué aux permissions spécifiées par
mode.
mq_close(3),
mq_getattr(3),
mq_notify(3),
mq_receive(3),
mq_send(3),
mq_unlink(3),
mq_overview(7)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Pierre Giraud <
[email protected]>
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 à
[email protected]