Проблема с разрешением очередей сообщений POSIX запрещена - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть программа server.c, которая инициализирует очередь сообщений со следующими разрешениями:

#define SERVER "/serverqueue"
...
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = MAX_MSGS;
attr.mq_msgsize = MAX_MSG_SIZE;
attr.mq_curmsgs = 0;
server = mq_open(SERVER, O_RDWR | O_CREAT, 666, &attr)
...

При первом запуске mq_open() успешен, и программа завершается без ошибок.При последующих выполнениях я получаю Permission denied ошибок на mq_open().Почему это происходит?
Если это уместно, я не закрываю / не отменяю дескрипторы очереди сообщений в явном виде, поскольку ОС делает это автоматически при выходе из программы, если я не ошибаюсь

1 Ответ

0 голосов
/ 17 февраля 2019

Очереди сообщений сохраняются после завершения процесса.Причина, по которой вторая попытка создания не удалась, заключается в том, что вы задаете режим как 666, что приводит к довольно странным разрешениям:

$ ls -l /dev/mqueue/serverqueue
--w--wx--T. 1 fw fw 80 Feb 17 13:13 serverqueue

Нет разрешений на чтение, поэтому открытие с O_RDWR завершается неудачей.

Кроме того, поскольку имена очередей являются общим ресурсом, это обычно приводит к уязвимости безопасности, если вы создаете очереди с O_CREAT вместо O_CREAT | O_EXCL.Другой пользователь мог создать ту же очередь с другими разрешениями и получить доступ к тому, что вы пытаетесь сделать с этой очередью.

...