【问题标题】:stat st_mode is always equal to 16877stat st_mode 始终等于 16877
【发布时间】:2017-10-14 15:43:21
【问题描述】:

我想知道一个文件是目录还是带有 stat 的常规文件:

#define _DEFAULT_SOURCE

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int is_regular_file(const char *path)
{
    struct stat path_stat;
    stat(path, &path_stat);
    return S_ISREG(path_stat.st_mode);
}

我在 Mac 和 Linux 上尝试,当我打印时,S_ISREG(path_stat.st_mode) 总是等于 1,path_stat.st_mode 总是等于 16877。

【问题讨论】:

  • 当返回值为1时为普通文件。 16877 的值是文件权限位和文件模式位(以及其他一些东西)的组合。它是一个位图,宏 S_ISREG 只是从该统计字段中提取一个位。建议阅读man 文件stat

标签: c unix system-calls stat


【解决方案1】:

16877是八进制40755,表示一个目录(八进制40000),权限为755(用户拥有完全权限,其他人拥有读取和遍历权限)。正如建议的那样,statchmod 手册页很有用。

例如,这是我的directory-editor 的屏幕截图,显示八进制模式(一个选项)而不是通常的符号模式:

【讨论】:

    【解决方案2】:

    path_stat.st_mode 始终等于16877

    st_mode 的值必须按位解释:

    低 12 位是您可以使用chmod 设置的文件访问权限。每个位代表一个文件权限。高4位为文件类型。

    16 位数 16877 的低 12 位将是 000111101101。这种组合意味着:

    ---rwxr-xr-x(为文件所有者读取、写入、执行;为其他人读取和执行)。这种组合对于目录和可执行文件来说是典型的。

    数字16877 的高 4 位是 4 (至少在 Linux 上意味着):“目录”。

    S_ISREG(path_stat.st_mode) 总是等于 ...

    S_ISREG 宏仅检查参数的高 4 位是否具有表示“文件类型是常规文件”的值。

    ... 总是等于 1

    这让我有点困惑:16877 应该是一个目录;但是S_ISREG 应该为常规文件返回 1,为其他任何文件(例如目录)返回 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2017-01-18
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多