1

刚开始学习一些基本的 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

4

1 回答 1

4

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

st.st_mode & S_IRWXU

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

st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)
于 2012-05-15T23:41:30.773 回答