我有一个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()
错误。为什么会这样?
如果相关,我不会显式关闭/取消链接消息队列描述符,因为如果我没记错的话,操作系统会在程序退出时自动关闭/取消链接
答案 0 :(得分: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
创建队列,通常会导致安全漏洞。另一个用户可以使用不同的权限创建相同的队列,从而获得对您要对该队列执行的操作的权限。