我尝试从特权进程创建POSIX消息队列(等待以后读取),然后从非特权进程打开此消息队列(发送消息),然后返回更高版本的mq_open():EACCES
如果创建进程和打开进程都是特权或两者都没有特权,则mq_open将成功。
我检查了mq_open手册,它说EACCES表示来电者无权在指定模式下打开它,但我不确定指定的模式是什么&#39; ... < / p>
在特权流程中创造成功:
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
我使用的是CentOS 6.5 64位
uname -r
2.6.32-431.el6.x86_64
你能帮我弄清问题是什么吗?提前谢谢。
答案 0 :(得分:2)
在这种情况下,你被创建过程的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的竞争条件。