如何打印文件的权限为字符串?(How do I print file permissions as

2019-10-21 04:27发布

我有一个mode_t烫发变量存储从另一个函数返回一个文件的权限。 我需要打印文件的权限为特林,形式

rw-r--r-- (0644)

但我得到的是

r--r--r-- (100644)

我怎样才能得到正确的权限? 我试着用搜索引擎,不明白我在做什么错。 这里是我的代码:

    void print_perms(mode_t perms)
    {
        printf( (perms & S_IRUSR) ? "r" : "-");
        printf( (perms & S_IWUSR) ? "w" : "-");
        printf( (perms & S_IXUSR) ? "x" : "-");
        printf( (perms & S_IRGRP) ? "r" : "-");
        printf( (perms & S_IWGRP) ? "w" : "-");
        printf( (perms & S_IXGRP) ? "x" : "-");
        printf( (perms & S_IROTH) ? "r" : "-");
        printf( (perms & S_IWOTH) ? "w" : "-");
        printf( (perms & S_IXOTH) ? "x" : "-");
    }
//later
print_perms(permissions);
printf(" (%d)\n", permissions);

Answer 1:

首先,UNIX文件权限以八进制常规表达,相应格式字符串是“%○”,而不是“%d”。 RW-R - R--是真的0644 ,但在C语言0644 == 420 ,例如(后者是在十进制)。

第二,有比在代码中指定9中使用更多的比特。 实际上,你应该这样说

printf(" (%3o)", perms&0777);


Answer 2:

请注意,在按位检查(那些你打印R,W和X),你只打印你所感兴趣的权限。当你使用%d打印权限,打印所有权限。 尝试检查S_IFREG也。 你会看到它会导致“意外” 100开始。 在权限字段,该位被设置为存储,这是一个“常规”文件。



文章来源: How do I print file permissions as a string?