c - mq_open() - EACCES,权限被拒绝

标签 c linux posix message-queue

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

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

最佳答案

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

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

相关文章:

c - 通过套接字传递链表

linux - 在找不到的 EC2 Linux 命令上安装 Composer

c - 当在同一文件中定义其调用函数时如何在 C 中模拟函数?

c - 如何找到地址空间中的漏洞?

c - 编译代码块时出错

c - 为什么大于 x7F 的十六进制编码字符在 printf 函数中显示不同?

c++ - 使用 VC 编译器在 Eclipse 中创建可执行文件

linux - (UNIX) fork() 如何在循环中工作?

c - 使用异步信号保证互斥安全

c - 无法获得正确的纳秒时间间隔