umask四位数中第一位是特殊权限屏蔽位,用于控制suid(4)、sgid(2)、sticky(1)是否被清零,不参与默认权限计算,仅过滤而非添加权限。

umask 的四位数字中,第一位不是“权限位”,而是用于控制特殊权限(SUID、SGID、Sticky)是否被自动设置的掩码位。但它不参与文件或目录默认权限的计算,只影响新创建文件/目录能否继承这些特殊权限。
第一位数字代表特殊权限的屏蔽开关
这个首位数字对应的是八进制中的最高位(即 4000、2000、1000 等),它表示:当用户创建文件或目录时,系统是否会把 SUID(4)、SGID(2)、Sticky(1)这些位“加进去”。而 umask 的第一位,就是决定这些位是否被强制清零。
例如:
- umask 0022:首位是 0 → 不屏蔽任何特殊权限(但普通文件默认不会设 SUID/SGID,所以实际无影响)
- umask 4022:首位是 4 → 屏蔽 SUID 位(即新建文件即使本应带 SUID,也会被去掉)
- umask 2022:首位是 2 → 屏蔽 SGID 位(对目录设 SGID 有影响,比如 /var/mail 默认需 SGID)
- umask 1022:首位是 1 → 屏蔽 Sticky 位(如 /tmp 若由普通用户创建,可能无法自动带 t)
为什么普通场景几乎不用第一位?
因为:
- 普通用户创建的文件,内核会忽略 SUID/SGID 位(除非是 root 或具有 CAP_FSETID 能力)
- 目录的 SGID 位(使新文件继承父目录组)和 Sticky 位(如 /tmp 防删)通常靠 显式 chmod 设置,而非依赖 umask 自动赋予
- umask 第一位只起“过滤”作用——它不能“添加”特殊权限,只能阻止已有请求的特殊权限位生效
实际生效逻辑是按位与取反
更准确地说,系统在创建文件时执行的操作是:
- 文件: 666 & ~umask(注意是按位取反后与)
- 目录: 777 & ~umask
- 其中 ~umask 是对整个 4 位八进制数取反(如 ~0022 → 7755,~4022 → 3755)
- 所以首位为 4(即二进制 100)时,~4022 的高位变成 0,导致最终结果中 SUID 位恒为 0











