【问题标题】:mq_open() - EACCES, Permission deniedmq_open() - EACCES,权限被拒绝
【发布时间】:2014-05-11 21:30:21
【问题描述】:

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

我使用的是 CentOS 6.5 64 位

uname -r
2.6.32-431.el6.x86_64

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

【问题讨论】:

    标签: c linux posix message-queue


    【解决方案1】:

    在这种情况下,你被创建过程的 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 的竞争条件。

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2015-07-20
      • 2016-03-14
      • 2016-11-14
      • 2014-01-24
      相关资源
      最近更新 更多