如何匹配open和stat mode_t?

时间:2014-06-19 19:02:02

标签: c unix posix file-permissions

我正在使用open创建一个文件并设置其权限,然后我使用stat获取文件权限....权限不匹配。 以下计划的结果是:

  

模式从open(600)和stat(100600)是不同的



如何比较open(2)设置并使用stat(2)检索的模式(权限)?

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

#include <fcntl.h>
#include <stdio.h>


int
main(int argc, char **argv, char **env) {

        const char *path = "/tmp/test";
        const mode_t mode = S_IRUSR | S_IWUSR;

        if (open(path, O_RDWR |  O_CREAT | O_EXCL, mode) == -1)
                err(1, "open for '%s' failed", path);

        struct stat sb;
        if (stat(path, &sb) != 0)
                err(2, "stat failed");

        if (mode != sb.st_mode)
                printf("mode from open (%o) and stat (%o) are different\n", 
                        mode, sb.st_mode);

        return 0;
}

由于

2 个答案:

答案 0 :(得分:3)

这是因为st_mode成员不仅包含访问权限,还包含许多其他标志(例如,您可以检查文件是否为符号链接)。 Docs here

答案 1 :(得分:0)

在提出user3477950's answercomment之后,我会得到答案;我用代码回答了我自己的问题。

关键部分是sb.st_mode & RWX_UGO

所以,我最终得到了类似的东西:

#define RWX_UGO (S_IRWXU | S_IRWXG | S_IRWXO)
//....
const mode_t file_mode = sb.st_mode & RWX_UGO;
if (mode == file_mode)
        printf("file_mode (%o) & RWX_UGO(%o) equals to(%o) which is "
                    "equal to mode(%o)\n", sb.st_mode, RWX_UGO, 
                    file_mode, file_mode);
else
        printf("mode from open (%o) and stat (%o) are different\n", 
                    mode, file_mode);


现在打印

  

file_mode(100600)&amp; RWX_UGO(777)等于(600)等于   模式(600)