【问题标题】:extracting digits from octal number in C从C中的八进制数中提取数字
【发布时间】: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。

标签: c bitmask octal


【解决方案1】:

使用 sys/stat.h 中定义的宏来解析模式位。

参考: http://www.johnloomis.org/ece537/notes/Files/Examples/ls2.html 函数 mode_to_letters() 了解实现细节。

【讨论】:

    【解决方案2】:

    您应该考虑使用已定义的宏,而不是尝试手动“解析”权限。假设您希望获得文件所有者用户的写入权限,可以这样检查:

    int wpo = buff.st_mode & S_IWUSR;
    if (wpo) {
      printf("Ower has write permission");
    } else {
      printf("Ower doesn't have write permission");
    }
    

    您会在文档中找到更多有用的宏:http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/stat.h.html

    【讨论】:

      【解决方案3】:

      掩码必须是 0700: 111 000 000 获取所有者权限 rwx

      【讨论】:

        猜你喜欢
        • 2015-08-16
        • 2015-09-07
        • 2011-04-04
        • 2017-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多