【问题标题】:How do I print file permissions as a string?如何将文件权限打印为字符串?
【发布时间】:2014-10-28 18:40:02
【问题描述】:

我有一个 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);

【问题讨论】:

  • 我怀疑您显示的代码是您拥有的代码,因为这不是有效的功能。请编辑您的帖子以包含 实际 代码。除此之外,这是很好且格式正确的第一个问题。 :)
  • 请注意,在 Unix 权限中,0644 通常是一个 八进制 值。如果您使用十进制值(100644 或 644)进行测试,您将看不到预期的结果。
  • 例如稍微修改过的代码版本,%o 的八进制输出为perms,按预期工作:ideone.com/IAFmLG
  • 好的,我看到您的解决方案有效。但是我能对领先的 10 人做些什么呢?那不应该在那里吗?数字 100644 是我获得的文件权限。

标签: c unix permissions


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 2011-07-10
      • 2014-02-09
      相关资源
      最近更新 更多