2
votes

Autorisation refusée lors de la tentative de création d'une file d'attente de messages à l'aide des files d'attente de messages POSIX

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?


9 commentaires

Votre limite de msgqueue est probablement fixée à 0. Regardez dans ulimit et limits.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


3 Réponses :


0
votes

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


2 commentaires

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



0
votes

États POSIX :

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


1 commentaires

mon nom est "/ my_message_queue" qui suit les règles de dénomination, je pense.



2
votes

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.


2 commentaires

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.