stat st_mode始终等于16877

时间:2017-10-14 15:43:22

标签: c unix system-calls stat

我想知道文件是目录还是带有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.

2 个答案:

答案 0 :(得分:3)

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

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

ded showing octal permissions

答案 1 :(得分:1)

  

path_stat.st_mode始终等于16877

st_mode的值必须按位解释:

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

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

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

数字16877的高4位是4(至少在Linux上的意思):&#34;目录&#34;。

  

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

S_ISREG宏只检查参数的高4位是否具有值:&#34;文件类型是常规文件。&#34;

  

...总是等于1

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