我在尝试使用mq_open()调用创建posix mq时遇到Permission问题。我确实纳入了此处提到的更改mq_open Permission denied我查看了其他相关帖子,例如https://groups.google.com/forum/#!topic/comp.unix.programmer/hnTZf6aPpbE,但这同样指向了同样的事情。
同时在尝试编译时遇到错误,其中mq调用未被识别,并且在线显示通过在gcc中添加-lrt进行编译,该帖子能够编译,提及它因为我不完全了解有关它并没有通过阅读帖子来理解它:)
gcc server_mq.c -lrt -o server
错误编号为13
哦亲爱的,mqd出了点问题! 许可被拒绝
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <errno.h>
#include <string.h>
#include "client_server.h"
#define PATH "/tmp/servermq"
int main(void)
{
mqd_t mqd;
mode_t omask;
omask = umask(0);
int flags = O_RDWR | O_CREAT | O_EXCL;
struct mq_attr attr, *attrp;
attr.mq_maxmsg = 5;
attr.mq_msgsize = 1024;
attrp = &attr;
mqd = mq_open(PATH, flags, S_IRUSR | S_IWUSR | S_IWGRP, attrp);
if (mqd == (mqd_t)-1)
{
printf("error number is %d \n ",errno);
printf(" Oh dear, something went wrong with mqd ! %s\n", strerror(errno));
}
umask(omask);
mq_close(mqd);
mq_unlink(PATH);
return 0;
}
答案 0 :(得分:3)
您无法使用/tmp/servermq
作为您的名字......
引用 man mq_overvie :
Message queues are created and opened using mq_open(3); this function returns a message queue descriptor (mqd_t), which is used to refer to the open message queue in later calls. Each message queue is identi- fied by a name of the form /somename; that is, a null-terminated string of up to NAME_MAX (i.e., 255) characters consisting of an initial slash, followed by one or more characters, none of which are slashes.
此外,您很快就会发现此部分相关:
挂载邮件队列文件系统
在Linux上,消息队列在虚拟文件系统中创建。 (其他 实现也可以提供这样的特征,但细节是 可能会有所不同。)可以安装此文件系统(由超级用户) 使用以下命令:# mkdir /dev/mqueue # mount -t mqueue none /dev/mqueue The sticky bit is automatically enabled on the mount directory.