1

我这样mq_open打电话linux 5.5.6

mq_open("/testing12345", O_RDWR | O_CREAT | O_NONBLOCK, 0777, & (struct mq_attr) {0, 10, 255, 0));

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

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

mount -t mqueue none ./mqueue_dir

然而,统计新 mqueue 的节点显示0755为访问位:

stat -c %a ./mqueue_dir/testing12345

0755

这是为什么?0777我在调用 mq_open 时清楚地传递了常量。


可重现的例子

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

#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;
}
4

1 回答 1

2

您的“文件创建掩码”设置几乎可以肯定设置为022,从而将0777您指定的“向下”“屏蔽”为0755

根据POSIXumask()文档(我的粗体字):

姓名

umask - 设置和获取文件模式创建掩码

概要

#include <sys/stat.h>

mode_t umask(mode_t cmask);

描述

umask()函数应将进程的文件模式创建掩码设置为cmask并返回掩码的先前值。cmask仅使用(see )的文件权限位<sys/stat.h>;其他位的含义是实现定义的。

进程的文件模式创建掩码用于关闭在调用以下函数期间提供的模式参数中的权限位:

  • open()、openat()、creat()、mkdir()、mkdirat()、mkfifo() 和 mkfifoat()

  • mknod(), mknodat()

  • mq_open()

  • sem_open()

设置的位位置cmask在创建文件的模式下被清除。

另请参阅umask() 何时有用?.

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

于 2020-03-02T14:17:10.493 回答