2014-10-28 21 views
1

我有一个mode_t perms变量,它存储从另一个函数返回的文件的权限。我需要打印文件的权限为特林,形式如何将文件权限打印为字符串?

rw-r--r-- (0644) 

的,但我得到的是

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

我怎样才能得到正确的权限?我试过Google搜索,并不明白我做错了什么。 这里是我的代码:

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

我怀疑你显示的代码是你有的代码,因为这不是一个有效的函数。请修改您的帖子以包含* actual *代码。除此之外,这是很好的格式良好的第一个问题。 :) – 2014-10-28 18:44:47

+0

请注意,在Unix权限中,“0644”通常是一个*八进制*值。如果您使用十进制值(100644或644)进行测试,则不会看到您期望的结果。 – 2014-10-28 18:48:20

+0

例如一个稍微修改过的代码版本,用'perm'的八进制输出的'%o',按预期工作:https://ideone.com/IAFmLG – 2014-10-28 18:52:44

回答

3

首先,UNIX文件权限通常以八进制表示,对应的格式字符串是“%o”,而不是“%d”。 rw-r - r--确实是0644,但以C语言0644 == 420为例(后者为十进制)。

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

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

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

相关问题