我在linux 5.5.6上打电话给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;
}发布于 2020-03-02 14:17:10
您的“文件创建掩码”设置几乎肯定设置为022,从而“掩蔽”了您指定的“向下”到0755的0777。
Per 文档 (黑石矿):
名称 设置并获取文件模式创建掩码。 简要说明 #包括 mode_t umask(mode_t掩码); 描述
umask()函数将进程的文件模式创建掩码设置为cmask,并返回掩码的前一个值。只使用cmask的文件权限位(参见<sys/stat.h>);其他位的含义是实现定义的。 进程的文件模式创建掩码用于关闭在调用下列函数期间提供的模式参数中的权限位:
在cmask 中设置的位位置将以创建文件的模式清除。
实际上,为了确保所创建的文件具有特定的模式,要么必须用umask( 0 )空白文件创建掩码,要么必须在创建文件后显式设置所需的模式。由于调用umask()会影响整个进程的状态,所以直接显式设置模式几乎总是更好。
https://stackoverflow.com/questions/60488945
复制相似问题