2014-04-01 233 views
3

我试图从一个特权进程(等待稍后读取)创建一个POSIX消息队列,然后从一个非特权进程(发送消息)打开这个消息队列,然后mq_open()返回:EACCES。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 

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

回答

2

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

相关问题