【发布时间】:2018-04-08 20:28:03
【问题描述】:
我正在尝试使用函数 stat() 获取文件或目录的文件权限。我可以得到正确的信息,例如; st_nlinks 用于硬链接的数量,而 st_mode 给出了文件的模式,这是我正在寻找的。但是 st_mode 中存储的值是八进制数。我现在如何仅提取所有者权限。
例如,st_mode 可能存储 42755,这意味着所有者具有读写和执行权限,但我不知道如何从数字中提取 7。如果这令人困惑,也许我下面的代码会澄清一些事情。
代码:
DIR *dirp;
struct dirent *dp;
struct stat buf;
dirp = opendir(".");
while ((dp = readdir(dirp)) != NULL){
stat(dp->d_name, &buf);
//now here I have the octal number for the file permissions
//If I put a print statement here like so:
printf(">> %o %s\n", buf.st_mode, dp->d_name);
}
所以你们中的一些人可能会看到我正在尝试做 ls -l 在 Unix 系统上所做的事情。因此,我不想打印出模式的八进制数,而是将其转换为:
drwxr-xr-x for the value stored in st_mode: 42755
我的教授建议使用掩码并对其执行按位运算。我明白他的意思,但我尝试了类似的方法:
mode_t owner = 0000100 & st_mode;
但是当我打印出所有者时,我得到了 100 的值。
printf(">> owner permission: %o\n", owner);
输出:
owner permission: 100
所以我对如何做到这一点感到困惑。有谁知道如何解决这个问题?
顺便说一句,如果有人想知道我使用 mode_t 作为所有者的类型,因为根据 stat (man 2 stat) 的手册页,stat 结构的成员变量 st_mode 是 mode_t 类型。我认为这就像一个 long int 或其他东西。
【问题讨论】:
-
mode_t owner = 0700 & st_mode;适合你吗? -
不,它没有。但是您的评论给了我一个想法,我尝试了 mode_t owner = 0x000001c0 & st_mode;这似乎奏效了
-
哦,等等,你肯定会这样做。我之前打错了 070。