mq_open()-EACCES,权限被拒绝

mq_open()-EACCES,权限被拒绝,c,linux,posix,message-queue,C,Linux,Posix,Message Queue,我试图从一个特权进程(等待稍后读取)创建一个POSIX消息队列,然后从一个非特权进程(发送消息)打开这个消息队列,稍后的mq_open()返回:EACCES 如果创建进程和打开进程都是特权或非特权的,则mq_open将成功 我查看了mq_open手册,它说EACCES意味着调用者没有权限在指定模式下打开它,但我不确定什么是“指定模式” 在特权流程中创造成功: struct mq_attr attr; attr.mq_flags = O_RDONLY; attr.mq_maxmsg = 10; a

我试图从一个特权进程(等待稍后读取)创建一个POSIX消息队列,然后从一个非特权进程(发送消息)打开这个消息队列,稍后的mq_open()返回:EACCES

如果创建进程和打开进程都是特权或非特权的,则mq_open将成功

我查看了mq_open手册,它说EACCES意味着调用者没有权限在指定模式下打开它,但我不确定什么是“指定模式”

在特权流程中创造成功:

struct mq_attr attr;
attr.mq_flags = O_RDONLY;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 1024;
attr.mq_curmsgs = 0;

mq_open("/myMq", (O_RDONLY| O_CREAT), (S_IRWXU | S_IRWXG | S_IRWXO) /* 777 */, &attr);
mqd_t mqd;
mqd = mq_open("/myMq", (O_WRONLY|O_NONBLOCK));
if ((mqd_t)-1 == mqd) {
    printf("mq_open %d %s\n", errno, strerror(errno)); }
在非特权进程中打开失败:

struct mq_attr attr;
attr.mq_flags = O_RDONLY;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 1024;
attr.mq_curmsgs = 0;

mq_open("/myMq", (O_RDONLY| O_CREAT), (S_IRWXU | S_IRWXG | S_IRWXO) /* 777 */, &attr);
mqd_t mqd;
mqd = mq_open("/myMq", (O_WRONLY|O_NONBLOCK));
if ((mqd_t)-1 == mqd) {
    printf("mq_open %d %s\n", errno, strerror(errno)); }
它给出错误:mq_open 13权限被拒绝

我使用的是CentOS 6.5 64位

uname -r
2.6.32-431.el6.x86_64

你能帮我找出问题所在吗。提前感谢。

在这种情况下,您被创建过程中的umask刺痛了

权限设置针对进程umask进行屏蔽

您可以使用:

mode_t omask;
omask = umask(0);
mq_open("/myMq", (O_RDONLY| O_CREAT), (S_IRWXU | S_IRWXG | S_IRWXO) /* 777 */, &attr);
umask(omask);
但是,如果您在多线程进程中运行,请注意与umask相关的争用条件