Linux中八进制权限位前缀零数量差异的设计逻辑问询
关于Linux权限八进制常量多零前缀的设计思路
哈哈,这个问题戳中了很多刚接触Linux权限常量的人的疑惑——明明C语言里一个0前缀就够表示八进制数了,为啥这些权限常量要写俩甚至仨零?其实这完全是可读性优先的设计思路,目的是让开发者一眼就能看懂这个常量对应哪一组权限,不用费劲换算二进制位。
普通权限位:用零占位对齐分组
咱们看那些基础权限常量,比如S_IRWXU(00700)、S_IRGRP(00040),它们的八进制写法其实对应了权限位的三个核心分组:
- 最左边的数字对应**文件所有者(User)**的权限(比如00700里的
7,就是读+写+执行的全权限) - 中间的数字对应**用户组(Group)**的权限(比如00070里的
7) - 最右边的数字对应**其他用户(Other)**的权限(比如00007里的
7)
多写的零就是用来“占位置”的,让每个分组的位置一目了然。比如看到00400,不用数后面的零,直接就知道这是所有者的读权限;看到00040,立刻就能反应过来是组的读权限——这种视觉上的对齐,比只写0700或者040要直观太多。
特殊权限位:用多零区分层级
至于S_ISUID(0004000)这类特殊权限常量,它们对应的是比普通权限更高位的控制位(SUID、SGID、粘滞位)。用三个零前缀,一是为了和普通权限的格式保持统一,二是能明确区分出这是特殊权限,不是普通的用户/组/其他权限。比如0004000一眼看过去就知道,这是比普通权限组更靠左的特殊位,不用再去回忆它对应的二进制位位置。
这种写法是POSIX标准里约定俗成的,毕竟写代码的时候,可读性比少打几个零重要多了——谁也不想每次看权限常量都要掰着手指头换算二进制对吧?
基础权限常量(按用户/组/其他分组)
S_IRWXU00700:文件所有者拥有读、写、执行权限S_IRUSR00400:文件所有者拥有读权限S_IWUSR00200:文件所有者拥有写权限S_IXUSR00100:文件所有者拥有执行权限S_IRWXG00070:用户组拥有读、写、执行权限S_IRGRP00040:用户组拥有读权限S_IWGRP00020:用户组拥有写权限S_IXGRP00010:用户组拥有执行权限S_IRWXO00007:其他用户拥有读、写、执行权限S_IROTH00004:其他用户拥有读权限S_IWOTH00002:其他用户拥有写权限S_IXOTH00001:其他用户拥有执行权限
Linux扩展的特殊权限常量
根据POSIX标准,mode中设置其他位的效果未作规定;在Linux系统中,mode还支持以下位:
S_ISUID0004000:设置用户ID位S_ISGID0002000:设置组ID位(参见stat(2))S_ISVTX0001000:粘滞位(参见stat(2))
内容的提问来源于stack exchange,提问作者K.Miao
相关产品推荐
相关产品推荐

