1

次の行は、現在のファイルがディレクトリかどうかをテストする必要があります。

if ((stbuf.st_mode & S_IFMT) == S_IFDIR)
      //file is a directory.

stbufタイプは どこですか

 struct stat            /* inode information returned by stat */
 {
      dev_t st_dev;     /* device of inode */
      ino_t st_ino;     /* inode number */
      short st_mode;    /* mode bits */
      short st_nlink;   /* number of links to file */
      short st_uid;     /* owners user id */
      short st_gid;     /* owners group id */
      dev_t st_rdev;    /* for special files */
      off_t st_size;    /* file size in characters */
      time_t st_atime;  /* time last accessed */
      time_t st_mtime;  /* time last modified */
      time_t st_ctime;  /* time originally created */
 };

およびは次のようS_IFMTS_IFDIR定義されます。

#define S_IFMT 0160000  /* type of file: */
#define S_IFDIR 0040000 /* directory */

上記のステートメントがどのように機能するか理解できませんか? その背後にあるロジックを誰か説明してください。
ありがとう。

4

3 に答える 3

3

基本的には、 のすべてのビットを取り、 のビットのstbuf.st_mode上に並べるかどうかを示しますS_IFMT。AND 演算の結果である 3 番目の行を生成します。truth tableAND 演算については、以下を参照してください。出力は、両方の入力がの1場合のみです。1

input1| input2| output
------+-------+-------
  0   |   0   |   0
  0   |   1   |   0
  1   |   0   |   0
  1   |   1   |   1

対応するビット位置のそれぞれについて0、数値の下に a を付けます。ただし、特定の位置にある対応するビットの両方が である場合を除き ます。この場合、a を記録します。11

たぶん、この視覚的なイメージが役立つでしょう:

st_mode   |  0100 0000 0000 0000 0000 0000 0000 0000
S_IFMT    |  1110 0000 0000 0000 0000 0000 0000 0000
bitwise & |===========================================
result    |  0100 0000 0000 0000 0000 0000 0000 0000

この結果のビット パターンを のビット パターンと比較しS_IFDIRます。それらが等しい場合、ディレクトリがあります。

おそらく、この SO question Using Struct Stat()も役立つでしょう。最後に、stat(3) の man ページには、この構造体のすべての詳細に加えて、いくつかのサンプル コードもあります。

于 2012-06-20T16:22:19.220 に答える
2

ソースとマスクからの対応するビットの各ペアについて、論理AND演算は、両方のビットが1に設定されている場合にのみ、オンビット(1)を返します。これは、マスクでオンになっていないすべてのビットがゼロになることを意味します。各文字がビットであるビットabcdefghを持つ1バイトがあるとすると、0または1のいずれかになります。たとえば、値が00111000のマスクがある場合、2つをAND演算すると00cde000になります。したがって、マスクを使用して、ビットのサブストリングだけを「切り取る」ことができます。多くの場合、マスクには1つのビットしか設定されていません。その場合、1つのビットをテストします。あなたの例では、マスクはS_IFMTです。これで、マスクがそのままにしておく3ビットのスペースに含まれるいくつかの値を取得できます。たとえば、00101000、00011000、または1ビットすべてがマスクで区切られたスペース内にあるものなどです(これがS_IFDIRの例です)。 )、と比較することができます。したがって、平易な言葉の場合、操作全体は「変数のビットのサブストリングを取得し、それが事前定義された値の1つであるかどうかを確認する」ことを意味します。これはすべてスペース効率のために行われます。重要でない場合、設計者はおそらくモードフィールドに別の変数を定義しているでしょう。

于 2012-06-20T16:29:49.943 に答える
2

ビット単位のANDは、特定の設定に関係するビットを取得していますS_IFDIR

結果がその場合、S_IFDIRそのフラグが設定されます。01600008進数で、整数の上位3ビットを表します。0040000は2番目のビットなので、オーバーラップします。

于 2012-06-20T16:24:13.697 に答える