Je crée une file d'attente de messages avec l'extrait suivant en suivant L'interface de programmation Linux .
if((mq_open("/my_message_queue", O_CREAT, O_RDWR, NULL)) == -1) { perror("mq creation failed"); }
En exécutant cet extrait, j'obtiens une erreur: "permission refusée". Je voulais vérifier et voir si j'avais créé la file d'attente auparavant et ne l'avais pas détruite, j'ai donc utilisé ipcs. Cependant, ipcs n'affiche aucune file d'attente de messages active. Je n'ai jamais utilisé les bibliothèques POSIX IPC dans mon environnement de développement auparavant (Ubuntu 18.04). Dois-je configurer certains éléments pour permettre à mon processus utilisateur de créer une file d'attente de messages? Est-ce que j'utilise l'API de manière incorrecte?
3 Réponses :
EACCES: La file d'attente existe, mais l'appelant n'a pas l'autorisation de ouvrez-le dans le mode spécifié.
ipcs ne vous montrera pas les files d'attente que vous ne pouvez pas lire. Le fait qu'il ne vous montre pas la file d'attente est cohérent avec mq_open renvoyant une erreur d'autorisation.
TLPI décrit mount -t mqueue dans un répertoire de votre choix. Vous pouvez ensuite utiliser ls (1) sur ce répertoire pour voir les files d'attente, et même interroger les états des files d'attente en lisant les "fichiers" dans ce répertoire.
Je suppose que la file d'attente existe et appartient à root ....
Puis-je afficher les files d'attente appartenant à la racine par une autre méthode? Je n'ai pas vu mount -t mqueue au chapitre 52, peut-être que je l'ai manqué.
vous avez raison, la file d'attente existe et appartient à root. Il est sous / dev / mqueue mais n'apparaît pas sous ipcs
... L'argument de nom est conforme aux règles de construction d'un chemin, sauf que l'interprétation des caractères
autres que le caractère
de début dans le nom est défini par l'implémentation ...
Sous Linux, le nom / my / message_queue
est incorrect. Linux exige que le nom commence par /
, mais il ne peut contenir aucun autre caractère /
.
Selon Linux mq_overview.7
page de manuel :
Les files d'attente de messages sont créées et ouvertes en utilisant
mq_open (3)
; cette fonction renvoie un descripteur de file d'attente de messages (mqd_t
), qui est utilisé pour faire référence à la file d'attente de messages ouverte lors des appels ultérieurs. Chaque file d'attente de messages est identifié par un nom de la forme/ somename
; c'est-à-dire un nul- chaîne terminée contenant jusqu'àNAME_MAX
(c'est-à-dire 255) caractères comprenant d'une barre oblique initiale, suivie d'un ou plusieurs caractères, aucun des qui sont des barres obliques.
mon nom est "/ my_message_queue" qui suit les règles de dénomination, je pense.
Depuis la page de manuel :
L'argument oflag spécifie les indicateurs qui contrôlent le fonctionnement de l'appel. (Les définitions des valeurs des indicateurs peuvent être obtenues en incluant
.) Exactement l'une des valeurs suivantes doit être spécifiée dans oflag:
O_RDONLY Ouvre la file d'attente pour recevoir uniquement des messages.
O_WRONLY Ouvre la file d'attente pour envoyer des messages uniquement.
O_RDWR Ouvre la file d'attente pour envoyer et recevoir des messages.
Vous n'avez aucune de ces trois valeurs dans votre code. Ou plutôt vous le faites, mais c'est dans l'argument mode
, pas dans l'argument oflag
, où le nombre correspondant a une signification complètement différente. Ce troisième argument est les bits d'autorisation du système de fichiers utilisés lors de la création de la file d'attente (tout comme le troisième argument de open ()
lors de la création d'un nouveau fichier), et non le mode dans lequel la file d'attente est ouverte.
Mais notez que O_RDONLY
est défini comme 0
. (mais cette est la seule réponse qui soit généralement juste, je pense)
@ o12c C'est un détail d'implémentation sur lequel il ne faut pas se fier. Je suis presque sûr que les valeurs réelles de ces macros ne sont pas définies par les normes pertinentes.
Votre limite de msgqueue est probablement fixée à 0. Regardez dans
ulimit
etlimits.conf
.Essayez d'exécuter
ulimit -q
à partir du terminal et voyez ce qu'il génère.ulimit -q renvoie 819200
Oh!
"/ my_message_queue"
. Vous essayez de créer une msgqueue dans le répertoire racine, sur laquelle vous ne devriez pas avoir l'autorisation d'écriture.Ok, merci de me l'avoir fait savoir, je vais changer ça
Dans quel répertoire puis-je créer des files d'attente de messages sur Ubuntu 18.04?
Essayez simplement de le mettre dans le répertoire de travail.
@ChristianGibbons Files d'attente de messages POSIX (
mq_open ()
) les noms peuvent commencer par un/
, et toute autre utilisation d'un caractère/
est une implémentation -défini. Sous Linux, seul le premier caractère/
est autorisé dans le nom passé àmq_open ()
.Vous avez besoin de plus que de
O_CREAT
dans le deuxième argument. Voir man7.org/linux/man-pages/man3/mq_open.3 .html