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 操作的结果。有关 AND 操作,请参见以下内容truth table,仅1两个输入均为时,输出为1

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

对于每个相应的位位置,将 a0放在数字下方,除非给定位置的 两个相应位都是1,在这种情况下,您记录 a 1

也许这个视觉图像会有所帮助:

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) 手册页还有一些示例代码。

于 2012-06-20T16:22:19.220 回答
2

按位与获取与特定设置有关的位S_IFDIR

如果结果是S_IFDIR,则设置该标志。0160000以八进制表示,表示整数的前 3 位。0040000是第二位,所以它们重叠。

于 2012-06-20T16:24:13.697 回答
2

对于来自源和掩码的每一对对应位,当且仅当这两个位都设置为 1 时,逻辑与运算会给出一个开启位 (1)。这意味着掩码中未开启的所有位都归零。假设您有一个带有位 abcdefgh 的单个字节,其中每个字母都是一个位,因此是 0 或 1。如果您有一个值为例如 00111000 的掩码,则两者将得到 00cde000。因此,使用掩码,您“剪切”了位的子串。通常,掩码只设置一个位,在这种情况下,您将测试一个位。在您的示例中,掩码是 S_IFMT。现在,您可以在掩码保持不变的 3 位空间中获取许多值,例如 00101000、00011000 或任何其所有 1 位都在掩码分隔的空间内的任何值(这就是您的 S_IFDIR 在您的示例中), 和你可以对比一下。因此,如果是简单的话,整个操作意味着“获取变量位的子字符串并检查它是否是预定义值之一”。这一切都是为了空间效率,如果它不重要,设计者可能会为模式字段定义一个单独的变量。

于 2012-06-20T16:29:49.943 回答