C 尝试使用POSIX消息队列创建消息队列时,权限被拒绝

C 尝试使用POSIX消息队列创建消息队列时,权限被拒绝,c,posix,ipc,C,Posix,Ipc,我正在创建一个消息队列,其中包含以下代码段 运行此代码段时,我收到一个错误:“权限被拒绝”。我想检查一下我以前是否创建了队列而没有销毁它,所以我使用了ipcs。但是,ipcs不显示任何活动消息队列。我以前从未在我的开发环境(Ubuntu 18.04)中使用过POSIX IPC库。我必须做一些设置才能允许我的用户进程创建消息队列吗?我是否错误地使用了API?EACCES:队列存在,但调用方没有访问的权限 以指定的模式打开它 ipcs不会显示无法读取的队列。它不会向您显示队列与返回权限错误的mq_o

我正在创建一个消息队列,其中包含以下代码段

运行此代码段时,我收到一个错误:“权限被拒绝”。我想检查一下我以前是否创建了队列而没有销毁它,所以我使用了ipcs。但是,ipcs不显示任何活动消息队列。我以前从未在我的开发环境(Ubuntu 18.04)中使用过POSIX IPC库。我必须做一些设置才能允许我的用户进程创建消息队列吗?我是否错误地使用了API?

EACCES:队列存在,但调用方没有访问的权限 以指定的模式打开它

ipcs不会显示无法读取的队列。它不会向您显示队列与返回权限错误的mq_open一致

TLPI描述将-t mqueue装载到您选择的目录中。然后,您可以在该目录上使用ls(1)查看队列,甚至可以通过读取该目录中的“文件”来查询队列的状态

我猜队列存在并且属于root….

。。。name参数符合路径名的构造规则,除了名称中的前导
字符以外的
字符的解释是由实现定义的

在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");
}