C语言中如何从stat返回的八进制st_mode提取所有者权限
提取stat()返回的st_mode中的所有者权限
嘿,这个问题其实挺典型的——st_mode里的权限信息是通过位掩码存储的,咱们用简单的位运算就能精准抠出所有者权限的部分!
先搞懂st_mode的结构
你看到的st_mode值(比如十进制42755),转换成八进制是010755:
- 前三位
010是文件类型标识(这里代表普通文件); - 后面六位
755就是权限位,分成三组:- 前三位
7:所有者(User)权限; - 中间三位
5:组(Group)权限; - 最后三位
5:其他(Other)权限。
- 前三位
每组权限的三位分别对应读(r)、写(w)、执行(x),八进制里的数字就是这三位的组合(比如7=4+2+1,对应rwx)。
提取所有者权限的两种方法
方法1:用系统预定义宏(推荐,更可读)
系统头文件<sys/stat.h>里预定义了专门的掩码宏:
S_IRWXU:所有者的读、写、执行权限掩码(值为0700);- 你也可以单独用
S_IRUSR(读,0400)、S_IWUSR(写,0200)、S_IXUSR(执行,0100)来判断单个权限。
提取所有者权限的步骤:
- 用
& S_IRWXU把st_mode中属于所有者的权限位保留,其他位清零; - 右移6位(因为每组占3位,所有者位在最左边,右移6位就把组和其他的权限位移出去),得到的就是所有者权限的八进制数值(比如7)。
示例代码:
#include <sys/stat.h> #include <stdio.h> #include <stdlib.h> int main() { struct stat file_info; const char* file_path = "test.txt"; // 换成你的文件/目录路径 if (stat(file_path, &file_info) == -1) { perror("Failed to get file status"); return EXIT_FAILURE; } // 提取所有者权限 mode_t owner_perms = (file_info.st_mode & S_IRWXU) >> 6; printf("所有者权限的八进制值:%o\n", owner_perms); // 输出7(对应rwx) // 也可以单独判断每个权限 if (file_info.st_mode & S_IRUSR) printf("所有者有读权限\n"); if (file_info.st_mode & S_IWUSR) printf("所有者有写权限\n"); if (file_info.st_mode & S_IXUSR) printf("所有者有执行权限\n"); return EXIT_SUCCESS; }
方法2:直接用数值掩码
如果不想用宏,直接用八进制掩码0700也能实现,逻辑和上面完全一致:
mode_t owner_perms = (file_info.st_mode & 0700) >> 6;
验证一下你的例子
你提到的st_mode值是42755,转换成八进制是010755:
010755 & 0700的结果是0700;0700 >> 6的结果是07(十进制7),正好就是你要的所有者权限数字!
内容的提问来源于stack exchange,提问作者Unks
相关产品推荐
相关产品推荐

