我正在按照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的方式不正确吗?
答案 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)
... name参数符合路径名的构造规则,但名称中前导
... ><slash>
字符以外的<slash>
个字符的解释是实现定义的...
在Linux上,名称/my/message_queue
不正确。 Linux要求名称以/
开头,但不能包含其他/
个字符。
根据Linux mq_overview.7
man page:
使用
mq_open(3)
创建和打开消息队列;这个功能 返回消息队列描述符(mqd_t
),该消息队列描述符用于引用 在以后的调用中打开消息队列。每个消息队列是 以/somename
格式的名称标识;就是说, 终止的字符串,最多NAME_MAX
(即255个)字符,包括 开头的斜杠,后跟一个或多个字符, 是斜线。