首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mq_open的oflag参数没有反映创建的mqueue文件的实际访问位

mq_open的oflag参数没有反映创建的mqueue文件的实际访问位
EN

Stack Overflow用户
提问于 2020-03-02 12:32:28
回答 1查看 135关注 0票数 1

我在linux 5.5.6上打电话给linux 5.5.6

代码语言:javascript
复制
mq_open("/testing12345", O_RDWR | O_CREAT | O_NONBLOCK, 0777, & (struct mq_attr) {0, 10, 255, 0));

请注意,我传递了0777作为第三个参数。

函数成功,并创建适当的mqueue,然后我从shell挂载mqueue文件系统:

代码语言:javascript
复制
mount -t mqueue none ./mqueue_dir

但是,对新mqueue节点的统计显示,0755作为访问位:

代码语言:javascript
复制
stat -c %a ./mqueue_dir/testing12345

0755

为什么会这样呢?在调用0777时,我显然传递了mq_open常量。

可复制示例

gcc -Wall -Werror -lrt a.c -o ./a编译

代码语言:javascript
复制
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <mqueue.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(void) {
    const mqd_t descriptor = mq_open("/testing12345", O_RDWR | O_CREAT | O_NONBLOCK, 0777, & (struct mq_attr) {0, 10, 255, 0});
    if(descriptor == -1) {
        perror("parent: failed opening mqueue");
        return EXIT_FAILURE;
    }

    sleep(30u);

    mq_unlink("/testing123");

    return EXIT_SUCCESS;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-02 14:17:10

您的“文件创建掩码”设置几乎肯定设置为022,从而“掩蔽”了您指定的“向下”到07550777

Per 文档 (黑石矿):

名称 设置并获取文件模式创建掩码。 简要说明 #包括 mode_t umask(mode_t掩码); 描述 umask()函数将进程的文件模式创建掩码设置为cmask,并返回掩码的前一个值。只使用cmask的文件权限位(参见<sys/stat.h>);其他位的含义是实现定义的。 进程的文件模式创建掩码用于关闭在调用下列函数期间提供的模式参数中的权限位:

  • open()、openat()、creat()、mkdir()、mkdirat()、mkfifo()和mkfifoat()
  • mknod(),mknodat()
  • mq_open()
  • sem_open()

cmask 中设置的位位置将以创建文件的模式清除。

另见umask()什么时候有用?

实际上,为了确保所创建的文件具有特定的模式,要么必须用umask( 0 )空白文件创建掩码,要么必须在创建文件后显式设置所需的模式。由于调用umask()会影响整个进程的状态,所以直接显式设置模式几乎总是更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60488945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档