1

いくつかの基本的な C の学習を開始し、Linux で stat() システム コールをいじっています。

そのため、 stat st_mode() から構造体に返されるのはビットフィールドです。そして、単純に 8 進数のアクセス許可を取得できますが、ビットフィールドの特定のフラグ、つまりその値を別の関数 (mkdir など) に送信することprintf("octal %o", st.st_mode)だけに関心があります。S_IRWXU, S_IRWXG and S_IRWXO

これが私のサンプルプログラムです。
これが、ハードコードされたディレクトリを持ち、関数に引数として渡されず、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 で上記のフラグのみを取得し、8 進数として渡して関数create_dir()で使用するにはどうすればよいmkdir()ですか?

もし私がそうしたら、必要のないcreate_dir(st.st_mode)他のすべてのフラグも渡さないでしょうかmkdir()... uid、gid、スティッキービットなど?

乾杯、B

4

1 に答える 1

4

コード内の作業の 99% は既に完了しています。あなたが言う時

st.st_mode & S_IRWXU

ビットマスクst.st_modeに存在するビットのみが残ります。S_IRWXUしたがって、必要なのは、他の 3 つを組み合わせた別のビットマスクです。

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