mq_open() - EACCES,权限被拒绝

pdi*_*pdi 5 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);
Run Code Online (Sandbox Code Playgroud)

在非特权进程中打开失败:

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)); }
Run Code Online (Sandbox Code Playgroud)

它给出了错误:mq_open 13 Permission denied

我使用的是 CentOS 6.5 64 位

uname -r
2.6.32-431.el6.x86_64
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*esh 4

在这种情况下,您会被创建过程的 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);
Run Code Online (Sandbox Code Playgroud)

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