我试图从特权进程创建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所困扰。



您可以使用:

mode_t omask;
omask = umask(0);
mq_open("/myMq", (O_RDONLY| O_CREAT), (S_IRWXU | S_IRWXG | S_IRWXO) /* 777 */, &attr);
umask(omask);

但是如果您在多线程进程中运行,请当心与umask相关的竞争条件。

关于c - mq_open()-EACCES,权限被拒绝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22780277/

10-11 06:16