繁体   English   中英

mq_open() - EACCES,权限被拒绝

[英]mq_open() - EACCES, Permission denied

我正在尝试从特权进程创建一个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权限被拒绝

我正在使用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的竞争条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM