mq_open() - EACCES,权限被拒绝 [英] mq_open() - EACCES, Permission denied

查看:902
本文介绍了mq_open() - EACCES,权限被拒绝的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建一个特权进程POSIX消息队列(等待稍后读取),然后打开从一个非特权过程中该消息队列(发送邮件),以及后来mq_open()返回:EACCES

I'm trying to create a POSIX message queue from a privileged process (waiting for later read), then open this message queue from an unprivileged process (to send message), and the later mq_open() returned: EACCES.

如果在创建过程和开放的过程都是特权或两者无特权,mq_open会成功。

If the create process and open process are both privileged or both unprivileged, mq_open will success.

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

I checked the mq_open manual, it says EACCES means the caller does not have permission to open it in the specified mode, but I'm not sure what is 'specified mode'...

创建特权进程的成功:

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);

打开失败在无特权的过程:

Open failed in unprivileged process:

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权限被拒绝

It gives the error: mq_open 13 Permission denied

我用的CentOS 6.5 64位

I'm using CentOS 6.5 64-bit

uname -r
2.6.32-431.el6.x86_64

您能帮我找出问题所在。先谢谢了。

Can you help me to figure out what the problem is. Thanks in advance.

推荐答案

在这种情况下,你被创建进程的umask的刺痛了。

In this case, you're being stung by the umask of the creating process.

权限设置被掩盖对过程的umask。

The permissions settings are masked against the process 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相关的竞争条件。

but beware of umask-dependent race conditions if you're running in a multi-threaded process.

这篇关于mq_open() - EACCES,权限被拒绝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆