我有一个mode_t permsvariables,它存储从另一个函数返回的文件的权限。 我需要打印文件的权限作为forms的Tring
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);
首先,UNIX文件权限通常以八进制表示,对应的格式字符串是“%o”,而不是“%d”。 rw-r – r–实际上是0644
,但以C语言0644 == 420
为例(后者是十进制的)。
其次,代码中使用的位数多于9。 你其实应该说一些像
printf(" (%3o)", perms&0777);
请注意,在逐位检查(打印r,w和x的那些检查)中,您只能打印感兴趣的权限。使用%d打印权限时,将打印所有权限。 尝试检查S_IFREG也。 你会看到它在一开始就引起了“意外”的100。 在权限字段中,该位设置为存储这是一个“常规”文件。