【问题标题】:POSIX message queues permission denied issuePOSIX 消息队列权限被拒绝问题
【发布时间】:2019-07-10 20:46:30
【问题描述】:

我有一个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() 成功,程序没有错误退出。在随后的执行中,我在mq_open() 收到Permission denied 错误。为什么会这样?
如果它相关,我不会像操作系统那样在程序退出时自动关闭/取消链接消息队列描述符,如果我没记错的话

【问题讨论】:

  • 大家好,我是IPC 的新手。如果你能把你的两分钱给我,那就太好了,即使这太微不足道了。谢谢:)

标签: unix posix ipc message-queue


【解决方案1】:

消息队列在进程退出后仍然存在。第二次创建失败的原因是因为你将模式指定为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 创建队列,通常会导致安全漏洞。另一个用户可能已经创建了相同的队列,但具有不同的权限,因此可以访问您尝试对队列执行的操作。

【讨论】:

  • 感谢您的回答!澄清一下,我认为 666 意味着对所有进程的读写权限。那么为什么O_RDWR 会失败呢?
  • 知道了,应该是0666,我的错。我更喜欢0660。感谢您的澄清:)
猜你喜欢
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2015-01-28
  • 2015-05-24
  • 2021-08-30
  • 1970-01-01
  • 2011-07-11
  • 2011-03-09
相关资源
最近更新 更多