Отказано в доступе при попытке создать очередь сообщений с использованием очередей сообщений POSIX - PullRequest
1 голос
/ 21 октября 2019

Я создаю очередь сообщений со следующим фрагментом, следуя Интерфейс программирования Linux .

if((mq_open("/my_message_queue", O_CREAT, O_RDWR, NULL)) == -1) {
    perror("mq creation failed");
}

При запуске этого фрагмента я получаю сообщение об ошибке: «Отказано в доступе». Я хотел проверить, не создал ли я очередь ранее, а не уничтожил ее, поэтому я использовал ipcs. Однако ipcs не показывает активных очередей сообщений. Я никогда не использовал библиотеки POSIX IPC в своей среде разработки (Ubuntu 18.04). Нужно ли что-то настроить, чтобы мой пользовательский процесс мог создать очередь сообщений? Я неправильно использую API?

Ответы [ 3 ]

2 голосов
/ 21 октября 2019

С справочная страница :

Аргумент oflag указывает флаги, управляющие операцией вызова. (Определения значений флагов можно получить, включив <fcntl.h>.) В oflag должно быть точно указано одно из следующих значений:

O_RDONLY Открыть очередь для получения только сообщений.

O_WRONLY Открытьочередь только для отправки сообщений.

O_RDWR Откройте очередь для отправки и получения сообщений.

В вашем коде нет ни одного из этих трех значений. Вернее, так и есть, но это в аргументе mode, а не в аргументе oflag, где соответствующее число имеет совершенно другое значение. Этот третий аргумент - это биты прав доступа к файловой системе, используемые при создании очереди (точно так же, как третий аргумент open() при создании нового файла), а не режим, в котором открывается очередь.

0 голосов
/ 21 октября 2019

Состояния POSIX :

... Аргумент name соответствует правилам построения для пути, за исключением того, что интерпретация <slash> символов отличается от начального <slash> символ в имени определяется реализацией ...

В Linux имя /my/message_queue неверно. Linux требует, чтобы имя начиналось с /, но оно не может содержать других / символов.

Согласно Linux mq_overview.7 man-странице :

Очереди сообщений создаются и открываются с использованием mq_open(3);эта функция возвращает дескриптор очереди сообщений (mqd_t), который используется для ссылки на открытую очередь сообщений в последующих вызовах. Каждая очередь сообщений идентифицируется по имени вида /somename;то есть строка с нулевым символом в конце длиной до NAME_MAX (т. е. 255) символов, состоящая из начального слэша, за которым следует один или несколько символов, ни один из которых не является слешем.

0 голосов
/ 21 октября 2019

EACCES: очередь существует, но вызывающая сторона не имеет разрешения открыть ее в указанном режиме.

ipcs не покажет вам очереди, которые вы не можете прочитать. То, что она не показывает вам очередь, согласуется с тем, что mq_open возвращает ошибку разрешения.

TLPI описывает mount -t mqueue в каталог по вашему выбору. Затем вы можете использовать ls (1) в этом каталоге для просмотра очередей и даже запрашивать состояния очередей, читая «файлы» в этом каталоге.

Я предполагаю, что очередь существует и принадлежит корню ....

...