C 尝试使用POSIX消息队列创建消息队列时,权限被拒绝
我正在创建一个消息队列,其中包含以下代码段 运行此代码段时,我收到一个错误:“权限被拒绝”。我想检查一下我以前是否创建了队列而没有销毁它,所以我使用了ipcs。但是,ipcs不显示任何活动消息队列。我以前从未在我的开发环境(Ubuntu 18.04)中使用过POSIX IPC库。我必须做一些设置才能允许我的用户进程创建消息队列吗?我是否错误地使用了API?EACCES:队列存在,但调用方没有访问的权限 以指定的模式打开它 ipcs不会显示无法读取的队列。它不会向您显示队列与返回权限错误的mq_open一致 TLPI描述将-t mqueue装载到您选择的目录中。然后,您可以在该目录上使用ls(1)查看队列,甚至可以通过读取该目录中的“文件”来查询队列的状态 我猜队列存在并且属于root….: 。。。name参数符合路径名的构造规则,除了名称中的前导C 尝试使用POSIX消息队列创建消息队列时,权限被拒绝,c,posix,ipc,C,Posix,Ipc,我正在创建一个消息队列,其中包含以下代码段 运行此代码段时,我收到一个错误:“权限被拒绝”。我想检查一下我以前是否创建了队列而没有销毁它,所以我使用了ipcs。但是,ipcs不显示任何活动消息队列。我以前从未在我的开发环境(Ubuntu 18.04)中使用过POSIX IPC库。我必须做一些设置才能允许我的用户进程创建消息队列吗?我是否错误地使用了API?EACCES:队列存在,但调用方没有访问的权限 以指定的模式打开它 ipcs不会显示无法读取的队列。它不会向您显示队列与返回权限错误的mq_o
字符以外的
字符的解释是由实现定义的
在Linux上,名称/my/message\u queue
不正确。Linux要求名称以/
开头,但不能包含其他/
字符
根据:
消息队列是使用mq_open(3)
创建和打开的;此函数
返回消息队列描述符(mqd\t
),用于引用
在以后的调用中打开消息队列。每个消息队列都是
由形式为/somename
的名称标识;也就是说,一个空值-
最多包含名称\u MAX
(即255个)字符的终止字符串,由
对于初始斜杠,后跟一个或多个字符,无
哪些是斜线。
发件人:
oflag参数指定控制调用操作的标志。(可以通过包含
来获得标志值的定义)必须在oflag中指定以下一项:
O_RDONLY打开队列以仅接收消息
O_wr仅打开队列以仅发送消息
O_RDWR打开队列以发送和接收消息
代码中没有这三个值。或者更确切地说是这样,但它是在
模式
参数中,而不是在oflag
参数中,相应的数字具有完全不同的含义。第三个参数是创建队列时使用的文件系统权限位(就像创建新文件时open()
的第三个参数),而不是队列打开的模式。您的msgqueue限制可能设置为0。查看ulimit
和limits.conf
。尝试从终端运行ulimit-q
,查看它的输出。ulimit-q返回819200Oh<代码>“/my\u message\u queue”。您正试图在根目录中创建一个msgqueue,您不应该对其具有写入权限。@ChristianGibbons POSIX消息队列(mq_open()
)名称允许以/
开头,任何其他/
字符的使用都是由实现定义的。假设使用Linux,传递给mq_open()
的名称中只允许使用前导的/
字符。我可以通过其他方法查看属于根目录的队列吗?在第52章中,我没有看到mount-tmqueue,可能我没有看到。您是对的,队列存在并且属于root。它位于/dev/mqueue下,但不显示在ipcsmy name is“/my_message_queue”下,我认为它遵循命名规则。但是请注意,O_RDONLY
被定义为0
。(但我认为这是唯一基本正确的答案)@o12c这是一个不应该依赖的实现细节。我很确定这些宏的实际值不是由相关标准设置的。
if((mq_open("/my_message_queue", O_CREAT, O_RDWR, NULL)) == -1) {
perror("mq creation failed");
}