
目录一、现象普通文件txt、二进制文件open 创建场景 1open 传入 mode0666本身无执行权限场景 2open 传入 mode0777理论携带读写执行目录文件mkdir 创建常规传入 mode0777二、根本原因三、标准无干扰实验操作两种通用方案方案 1源码拷贝到家目录编译运行推荐写法方案 2共享目录编译可执行文件迁移到家目录运行四、拓展区分支持完整 Linux 权限计算的目录与不支持的目录可正常执行 umask 权限运算原生 Linux 文件系统强制覆盖权限、不适合权限实验的分区五、通用测试代码市面经典 umask 教学示例六、全文总结一、现象VMware 虚拟机共享目录默认路径为 /mnt/hgfs/在该目录下运行测试 umask、open 文件权限的 C 程序时会出现权限异常代码设置任意 umask()、open 传入任意 mode新建文件权限永远固定为 rwxrwxrwx无法复现 umask(0444) 剥离全部读权限、生成 --w--w--w- 的预期实验结果理论计算权限与 ls -l 查看结果完全不符极易产生学习误区。修正说明--w--w--w- 权限释义区分普通文件、目录两类场景umask(0444) 掩码仅屏蔽读 (r) 权限位不会主动操作执行 (x) 权限位执行位最终是否保留由文件类型与创建时传入的 mode 共同决定。普通文件txt、二进制文件open 创建Linux 内核有强制规则普通文件新建时无论 mode 是否携带执行权限内核都会自动清除 x 执行位仅保留读写相关权限。场景 1open 传入 mode0666本身无执行权限moderw- rw- rw-umask (0444) 剥离全部 r 位最终权限 --w--w--w-。场景 2open 传入 mode0777理论携带读写执行理论计算结果0777 ~0444 0333-wx-wx-wx但内核强制抹除普通文件 x 位实际权限依旧为 --w--w--w-。目录文件mkdir 创建常规传入 mode0777目录无内核强制清理执行位的限制x 是进入、遍历目录的必要权限仅会剥离 umask 指定的权限位。open 传入 mode0777rwx rwx rwxumask (0444) 仅剥离全部 r 位w、x 完整保留最终目录权限 -wx-wx-wx核心总结umask 仅负责剥夺指定权限普通文件 x 位会被内核强制清除目录文件 x 位不受内核干预。二、根本原因/mnt/hgfs 是 Windows 与 Linux 互通的特殊共享文件系统两层限制直接屏蔽 Linux 标准权限计算机制Windows NTFS/FAT 文件系统不支持 Linux 三段式 r/w/x 权限模型无属主、属组、其他用户权限区分虚拟机挂载共享目录时内核强制写入全局权限参数完全忽略进程内 umask() 与 open 的 mode 参数所有新建文件统一赋予 0777 全权限该限制属于挂载层强制规则C 语言代码、终端命令行 umask 均无法覆盖。三、标准无干扰实验操作两种通用方案方案 1源码拷贝到家目录编译运行推荐写法# 1. 将共享目录源码复制至Linux家目录 cp /mnt/hgfs/test_umask.c ~/ # 2. 切换至原生Linux文件系统目录 cd ~ # 3. 编译程序 gcc test_umask.c -o umask_test # 4. 运行生成测试文件 ./umask_test demo.txt # 5. 查看真实文件权限 ls -l demo.txt在家目录运行后正常输出 --w--w--w-和权限计算理论完全匹配。方案 2共享目录编译可执行文件迁移到家目录运行适合仅在共享目录编辑、编译代码的场景# 1. 进入共享目录编译 cd /mnt/hgfs gcc test_umask.c -o umask_test # 2. 拷贝可执行文件到家目录 cp umask_test ~/ # 3. 到家目录执行、验证权限 cd ~ ./umask_test demo.txt ls -l demo.txt四、拓展区分支持完整 Linux 权限计算的目录与不支持的目录可正常执行 umask 权限运算原生 Linux 文件系统用户家目录 ~/实验首选系统临时目录 /tmp手动创建本地文件夹如 mkdir ~/test_file强制覆盖权限、不适合权限实验的分区虚拟机共享目录 /mnt/hgfs/Windows NTFS/FAT32 U 盘、外接磁盘挂载点Samba、NFS 跨主机共享目录多数挂载配置屏蔽 umask五、通用测试代码市面经典 umask 教学示例#include fcntl.h #include stdio.h #include unistd.h #include sys/stat.h int main(int argc, char *argv[]) { int fd; // 掩码剥离所有用户读(r)权限不处理执行(x)位 umask(0444); // 新建普通文件期望权限0666替换为0777可对比测试 fd open(argv[1], O_WRONLY | O_CREAT, 0666); if(fd -1) { perror(open failed); return -1; } close(fd); return 0; }对比实验效果/mnt/hgfs 共享目录运行生成文件权限固定 rwxrwxrwx无法验证 umask 逻辑用户家目录运行无论 mode 填 0666 或 0777最终普通文件权限均为 --w--w--w-符合内核权限规则。六、全文总结VMware 共享目录固定路径 /mnt/hgfs/挂载机制强制屏蔽 Linux 原生权限规则无视代码内 umask 与 open 的 modeumask(0444) 仅剥离读权限执行位保留与否区分文件类型普通文件内核强制清除 x目录文件完整保留 w、x验证 umask、open 权限联动实验禁止在 /mnt/hgfs 内生成测试文件标准实验规范源码 / 可执行文件迁移至 Linux 家目录 ~/ 运行才能观察到理论匹配的真实文件权限Windows 跨平台挂载磁盘、共享分区均不适合用来学习 Linux 文件权限掩码知识点。