如何匹配文件打开模式和文件状态模式(mode_t)?

3
我正在使用open创建文件并设置其权限,然后使用stat获取文件的权限...但是权限不匹配。
下面程序的结果是:

来自open(600)和stat(100600)的mode不同

我如何比较由open(2)设置和由stat(2)取回的mode(权限)?
#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个回答

4
这是因为st_mode成员不仅包含访问权限,还包括其他一些标志(例如您可以检查文件是否是符号链接)。在这里查看文档

感谢你的回答。我已经阅读了文档,st_mode确实提供了更多的信息,但问题是如何将 st_modeopen 中使用的 t_mode 进行比较。一个代码示例会非常有用。 - user454322
@user454322 你可以使用 0777 来屏蔽噪音。顺便说一句,我不确定为什么你想要测试模式是否相等。最好使用提供的宏来测试各个标志位。 - The Paramagnetic Croissant
@user454322,说得对,严格来说它并不是绝对可移植的,尽管我不知道有哪个Unix系统会将0777解释为rwx。出于可移植性的考虑,您可以将其替换为所有S_I*宏按位OR在一起的形式。 - The Paramagnetic Croissant
请原谅我的无知。我正在使用 #define RWX_UGO (S_IRWXU | S_IRWXG | S_IRWXO),但仍然无法理解。您能提供一下代码吗? - user454322
1
@user454322 #define RWX <所有9个宏按位或>,然后 if ((mode & RWX) == (st.st_mode & RWX)) { ... } 等。 - The Paramagnetic Croissant
显示剩余3条评论

0

在点赞user3477950的答案评论后,我找到了答案并用代码回答了自己的问题。

关键部分是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) & RWX_UGO(777) 等于(600),即等于 模式(mode) (600)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接