mq_open() – EACCES,权限被拒绝

我试图从一个特权进程创build一个POSIX消息队列(等待稍后读取),然后从一个非特权进程(发送消息)打开这个消息队列,并且后来的mq_open()返回:EACCES。

如果创build进程和打开进程都是特权或两者都没有特权,mq_open将成功。

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

在特权过程中创build成功:

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 

你能帮我弄清楚是什么问题。 提前致谢。

Solutions Collecting From Web of "mq_open() – EACCES,权限被拒绝"

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