一、umask 核心概念umask 是 Linux 进程级权限掩码作用是剥夺权限不是设置权限。最核心特性只对新建文件/目录生效对已经存在的文件完全无效不会修改旧文件任何权限。新建文件最终权限计算公式必考实际权限 mode (~umask)头文件与函数原型#include sys/stat.h mode_t umask(mode_t mask);mask八进制掩码值返回值修改前的旧掩码。二、Linux 基础权限规则权限分为三段属主、组用户、其他用户每段三位r(4)、w(2)、x(1)。本文固定搭配mode 0666期望权限 rw- rw- rw-umask 0444屏蔽所有用户的 r 读权限三、本篇专属核心源码固定唯一示例下面是本篇所有分析、现象、报错的唯一来源源码无额外杂例#include fcntl.h//open函数需要 #include stdio.h//printf perror 需要 #include errno.h//里面会有错误码 #include unistd.h #include sys/stat.h//umask 需要包含头文件 int main(int argc,char *argv[]) { int fd; umask(0444);//剥离所有读权限 // 两种flags模式二选一测试 //fd open(argv[1],O_RDWR | O_CREAT ,0666); fd open(argv[1],O_WRONLY | O_CREAT ,0666); if(fd -1) { perror(failed to open); return -1; } close(fd); return 0; }四、umask(0444) 权限完整计算 权限细节修正1、标准计算mode0666umask0444期望权限0666 rw- rw- rw-掩码剥离0444 r-- r-- r--最终权限0222 --w- --w- --w-2、关键权限细节重点、纠正误区umask 只会剥离指定权限位不会主动删除 x 执行位最终有没有 x 权限分文件类型1普通文件open 创建的 .txt 普通文件Linux 内核有硬性规则普通文件永远不会自带执行权限。哪怕你设置 mode0777理论计算0777 ~0444 0333-wx -wx -wx实际结果内核强制清掉 x 位最终依然是--w--w--w-所以本篇代码无论 mode 给 0666 还是 0777普通文件最终权限完全一致。2目录文件mkdir 创建不属于本篇代码目录无内核强制清 x 规则mode0777umask0444只剥离 r 位保留 w、x最终目录权限-wx-wx-wx本篇代码只创建普通文件所以只需要记住最终权限一定是 --w--w--w-五、两大核心实战场景本篇唯一场景无多余例子场景一O_RDWR | O_CREAT 第一次成功第二次报错fd open(argv[1],O_RDWR | O_CREAT ,0666);第一次运行文件不存在O_CREAT 生效umask(0444) 剥离读权限生成仅有写权限的文件打开成功。第二次运行文件已存在O_CREAT、mode、umask 全部失效O_RDWR 需要读写权限但文件无读权限 → open 报错。场景二O_WRONLY | O_CREAT 可无限重复运行、不报错fd open(argv[1],O_WRONLY | O_CREAT ,0666);第一次运行新建文件权限 --w--w--w-打开成功。第二次运行O_WRONLY 只向内核申请写权限文件刚好拥有写权限权限校验通过正常打开不报错保留原文件内容。六、umask 与 open 的真实联动机制紧扣源码umask、mode 只在 O_CREAT 新建文件时生效。文件一旦创建成功后续再次运行程序mode、umask 全部无效不会修改旧文件权限。umask 决定了文件出生那一刻的初始权限直接决定你后续能用什么 flags 打开文件。本篇报错根源umask(0444) 剥掉了读权限导致后续 O_RDWR 打不开、O_WRONLY 能打开。七、高频误区完全贴合本篇代码误区1再次运行程序mode0666 可以修复文件读权限 → 错旧文件完全不走 mode/umask。误区2umask 能修改已有文件权限 → 错只影响新建。误区3mode0777 能让普通文件带执行权限 → 错普通文件内核强制清除 x 位。误区4O_TRUNC 可以恢复读权限 → 错只清内容不改权限位。八、全文核心总结umask 是剥夺权限不是设置权限只减不加。本篇固定逻辑umask(0444) mode(0666) 生成文件权限--w--w--w-。O_RDWR 需要读权限 → 二次打开失败O_WRONLY 只需要写权限 → 可重复打开。普通文件无论 mode 是否带 x最终都无执行权限目录文件才会保留 x 位。mode、umask 仅新建瞬间生效文件成型后永久固定。