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

时间:2019-10-20 21:26:22

标签: c posix ipc

我正在按照The Linux Programming Interface创建具有以下代码段的消息队列。

if((mq_open("/my_message_queue", O_CREAT, O_RDWR, NULL)) == -1) {
    perror("mq creation failed");
}

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

3 个答案:

答案 0 :(得分:2)

来自the man page

  

oflag参数指定用于控制调用操作的标志。 (可以通过包含<fcntl.h>来获得标志值的定义。)确切地,必须在oflag中指定以下之一:

     

O_RDONLY打开队列仅接收消息。

     

O_WRONLY打开队列仅发送消息。

     

O_RDWR打开队列以发送和接收消息。

您的代码中没有这三个值。确切地说,您可以这样做,但是它是在mode参数中,而不是oflag参数中,其中相应的数字含义完全不同。第三个参数是创建队列时使用的文件系统权限位(就像创建新文件时open()的第三个参数一样),而不是打开队列的方式。

答案 1 :(得分:0)

EACCES:队列存在,但是呼叫者没有权限               以指定模式打开它。

ipcs不会向您显示您无法阅读的队列。它没有向您显示队列,这与mq_open返回许可权错误一致。

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

我的猜测是队列存在并且属于根。...

答案 2 :(得分:0)

POSIX states

  

... name参数符合路径名的构造规则,但名称中前导<slash>字符以外的<slash>个字符的解释是实现定义的... ... >

在Linux上,名称/my/message_queue不正确。 Linux要求名称以/开头,但不能包含其他/个字符。

根据Linux mq_overview.7 man page

  

使用mq_open(3)创建和打开消息队列;这个功能          返回消息队列描述符(mqd_t),该消息队列描述符用于引用          在以后的调用中打开消息队列。每个消息队列是          以/somename格式的名称标识;就是说,          终止的字符串,最多NAME_MAX(即255个)字符,包括          开头的斜杠,后跟一个或多个字符,          是斜线。