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

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

最佳答案

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

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

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

关于c - 如何将文件权限打印为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26616038/

相关文章:

c - 当数组从main传递给另一个函数时如何找到整数数组长度?

使用 fread 和 fwrite 时正确使用错误检查(包括 Ferr)

linux - 如何使用unix在数据库中登录和执行命令?

nginx - Nginx的 Alpine docker 失败,没有以前的ls?

c - 这是什么意思 : (void *) 0x00

c - 主循环后的GTK

c - 如何在程序输出本身中查看当前进程状态

shell - 使用 Travis CI 在 UNIX shell 脚本上进行测试

permissions - Advantage 数据字典中自动创建的 ADSSYS 用户的作用是什么?

flutter upgrade - 无法在 "/Users/.../.config/flutter"创建目录。 - Flutter 守护进程已终止