【问题标题】:Linux C stat() octal permissions masks, concatenate to send to function?Linux C stat()八进制权限掩码,连接发送到函数?
【发布时间】:2012-05-15 23:32:16
【问题描述】:

刚开始学习一些基本的 C 语言并在 Linux 上使用 stat() 系统调用。

所以st_mode 从 stat() 返回的结构中是一个位域。我可以通过简单的printf("octal %o", st.st_mode) 获得八进制权限,但我只对位域中的某些标志感兴趣,即S_IRWXU, S_IRWXG and S_IRWXO 将该值发送到另一个函数,例如:mkdir。

这是我的示例程序。
忽略这个事实,这是一个带有硬编码目录的垃圾程序,没有作为参数传递给 create_dir() 函数,也没有错误检查。

#include <stdio.h>
#include <sys/stat.h>

static int create_dir(mode_t mode) {
  mkdir("/home/user/blahnew", mode);
}

main() {
  struct stat st;
  int res;
  res = stat("/home/user/blah", &st);

  printf("user %o\n", st.st_mode & S_IRWXU);
  printf("group %o\n", st.st_mode & S_IRWXG);
  printf("other %o\n", st.st_mode & S_IRWXO);

  create_dir(mode);

  return 0;
}

如何在 st.st_mode 中仅获取上述标志并将其作为八进制传递给 create_dir() 以供 mkdir() 函数使用?

如果我只是做了create_dir(st.st_mode),那不会也传递mkdir() 不需要的所有其他标志...uid、gid、sticky bit 等?

干杯,B

【问题讨论】:

    标签: c mkdir stat


    【解决方案1】:

    您已经在代码中完成了 99% 的工作。当你说

    st.st_mode & S_IRWXU
    

    只保留st.st_mode 中存在于S_IRWXU 位掩码中的位。所以你想要的是一个不同的位掩码,它结合了其他三个:

    st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)
    

    【讨论】:

    • 砰!这就是我所缺少的,一种加入位掩码标志的方法。我知道必须有一种方法,这比我想象的要容易!谢谢!
    • 很高兴为您提供帮助。您可以看到按位或将如何设置其他掩码中存在的任何位。如果这回答了您的问题,您能否将其标记为已接受?
    • 完成。你回答得太快了,我不得不等几分钟才接受!
    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多