这张图是使用结构体 struct stat
中的 st_mode
字段时画的,获取表示文件的类型和权限,它是典型的 POSIX 系统调用(如 stat() 和 fstat())返回的 struct stat 结构的一部分,用于描述文件的元数据。
在 Linux 和 Unix 系统中,st_mode 是一个 16 位或 32 位的整数值,其中每一部分的位表示文件的类型、权限以及其他属性。
在该图中,u_r
, g_r
, o_r
, o_w
是文件权限的位表示,来源于文件的 权限位(mode bits),它定义了用户对文件的访问权限。这篇文章是对权限位的详细说明:
权限位(mode bits)
在 Linux 和类似的操作系统中,文件权限由 9 个基本位表示,分为三组:
- 用户权限(User, u): 文件所有者对文件的权限。
- 组权限(Group, g): 与文件所有者同组的其他用户对文件的权限。
- 其他权限(Others, o): 系统中其他用户对文件的权限。
每组包含 3 位:
- r:读权限(Read)。
- w:写权限(Write)。
- x:执行权限(eXecute)。
位表示
权限位的映射:文件权限以二进制的方式存储在 st_mode 的后 9 位中。每个权限占 1 位:
- 如果某位为 1,表示有该权限。
- 如果某位为 0,表示没有该权限。
权限位的结构如下:
位: 8 7 6 5 4 3 2 1 0
权限:u_r u_w u_x g_r g_w g_x o_r o_w o_x
- u_r:用户读权限(第 8 位)。
- u_w:用户写权限(第 7 位)。
- u_x:用户执行权限(第 6 位)。
- g_r:组读权限(第 5 位)。
- g_w:组写权限(第 4 位)。
- g_x:组执行权限(第 3 位)。
- o_r:其他读权限(第 2 位)。
- o_w:其他写权限(第 1 位)。
- o_x:其他执行权限(第 0 位)。
图中权限解释
如最初的图中所示(小端序排序):
- o_w(第 1 位):其他用户有写权限。
- o_r(第 2 位):其他用户有读权限。
- g_r(第 5 位):组有读权限。
- u_r(第 8 位):用户有读权限。
因此,这些位对应的权限是:
- 用户(u):读(r)。
- 组(g):读(r)。
- 其他用户(o):读(r)和写(w)。
权限的存储和表示
权限以八进制或符号形式表示:
符号表示
权限可以用符号表示,如:
rw-r--rw-
# 用户(u):rw-(读、写,无执行权限)。
# 组(g):r--(只读,无写和执行权限)。
# 其他(o):rw-(读、写,无执行权限)。
八进制表示
权限也可以用八进制表示:
- 每 3 位二进制转换为 1 位八进制数。
rw- r-- rw-
110 100 110 -> 八进制:`644`
权限检查
权限位的检查(位操作)
在代码中,通过与操作(&)可以检查权限位是否被设置。例如:
- 检查用户是否有读权限(u_r):
if (st_mode & (1 << 8)) {
// 用户有读权限
}
// 1 << 8:将二进制 1 左移到第 8 位位置,从而匹配用户读权限位。
// st_mode & (1 << 8):通过与操作检查第 8 位是否为 1。
- 检查其他用户是否有写权限(o_w):
if (st_mode & (1 << 1)) {
// 其他用户有写权限
}
权限存储在文件的 st_mode 中,后 9 位分别对应用户、组、其他用户的读、写、执行权限。我们也可以通过位操作实现轻松检查和修改文件权限,这是操作系统权限管理的重要部分。
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!