You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)来判断单个权限。

提取所有者权限的步骤:

  1. 用& S_IRWXU把st_mode中属于所有者的权限位保留,其他位清零;
  2. 右移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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:03:19