stat st_mode 始终等于 16877

stat st_mode is always equal to 16877

我想知道一个文件是目录还是普通文件,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.

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

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

path_stat.st_mode is always equal to 16877

st_mode的值必须按位解释:

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

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

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

数字 16877 的高 4 位是 4(至少 Linux 表示):"Directory".

S_ISREG(path_stat.st_mode) is always equal to ...

S_ISREG 宏只是检查参数的高 4 位是否具有以下含义的值:"File type is a regular file."

... is always equal to 1

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