mq_open() - EACCES,权限被拒绝

6
我正在尝试从特权进程(等待后续读取)创建一个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)); }

出现错误:mq_open 13 Permission denied

我正在使用64位的CentOS 6.5。

uname -r
2.6.32-431.el6.x86_64

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

1个回答

4

在这种情况下,您受到创建进程的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依赖的竞争条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接