如何将文件权限打印为字符串?

时间:2014-10-28 18:40:02

标签: c unix permissions

我有一个mode_t perms变量,它存储从另一个函数返回的文件的权限。我需要将文件权限打印为格式

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);

2 个答案:

答案 0 :(得分:3)

首先,UNIX文件权限通常以八进制表示,相应的格式字符串是"%o",而不是"%d"。 rw-r - r--实际上是0644,但是在C语言0644 == 420中,例如(后者是十进制的)。

其次,使用的位数多于代码中指定的9位。你其实应该说像

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

答案 1 :(得分:1)

请注意,在按位检查(打印r,w和x的那些)中,您只打印您感兴趣的权限。 使用%d打印权限时,将打印所有权限。尝试检查S_IFREG。你会看到它会导致意想不到的'一开始就是100。在权限字段中,此位设置为存储这是一个常规的'文件。