NOM

mq_open - Ouvrir une file de messages

BIBLIOTHÈQUE

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

SYNOPSIS

#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);

DESCRIPTION

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.

VALEUR RENVOYÉE

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.

ERREURS

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).

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes(7).
Interface Attribut Valeur
mq_open() Sécurité des threads MT-Safe
 

STANDARDS

POSIX.1-2001, POSIX.1-2008.

NOTES

différences entre bibliothèque C et noyau

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.'

BOGUES

Avant Linux 2.6.14, l'« umask » du processus n'est pas appliqué aux permissions spécifiées par mode.

VOIR AUSSI

mq_close(3), mq_getattr(3), mq_notify(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7)

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 <[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]