使用inotify 帮助理解代码的C 程序

Posted

技术标签:

【中文标题】使用inotify 帮助理解代码的C 程序【英文标题】:C program using inotify help in understanding code 【发布时间】:2016-01-23 19:19:14 【问题描述】:

我指的是inotify 的手册页,我遇到了这段代码

               if (event->mask & IN_ISDIR)
                   printf(" [directory]\n");
               else
                   printf(" [file]\n");

其中 event 是指向结构 inotify_event 的指针。

我无法理解这一行 if (event->mask & IN_ISDIR) 以及为什么在此处使用 bitwise AND

如何确定bitwise AND 应该在这里使用而不是其他? inotify 的手册页中没有提到它。

【问题讨论】:

您链接的页面显示 “可能在 read(2) 返回的掩码字段中设置以下位:... IN_ISDIR 此事件的主题是目录。” 这是一个不同的函数,但表明这是一个位域。 【参考方案1】:

这个按位与屏蔽了一个特定的位 (IN_ISDIR)。它正在测试是否设置了这一位。如果在event->mask 中设置了此位,则计算结果为真。

例如,

#include <stdio.h>

#define FIRST_BIT  1
#define SECOND_BIT 2
#define THIRD_BIT  4

int main() 
  int x = 3;  /* 3 in binary is 011 */

  if ( x & FIRST_BIT )
    printf("First bit is set\n");
  if ( x & SECOND_BIT )
    printf("Second bit is set\n");
  if ( x & THIRD_BIT )
    printf("Third bit is set\n");

会给出输出

    First bit is set
    Second bit is set

来自inotify.h

#define IN_ISDIR          0x40000000    /* event occurred against dir */

这个值只设置了一位。 (在二进制中,这是01000000000000000000000000000000。)与此(0x40000000)和某个变量的按位与将评估为0(如果变量在这里有0),或者如果变量在同一个地方有1,则为0x40000000。任何非零值都被认为是“真”。

从逻辑上讲,它正在测试event 是否来自目录(而不是文件)。

【讨论】:

干净整洁。谢谢@e0k【参考方案2】:

按位与只是检查是否设置了特定位的一种简单(并且非常常见)的方法。 手册页很清楚,如果设置了该位,则该事件是指一个目录。

【讨论】:

以上是关于使用inotify 帮助理解代码的C 程序的主要内容,如果未能解决你的问题,请参考以下文章

rsync+inotify实时备份

inotify 工具 是一种强大的细粒度的异步文件系统监控机制

RubyMine - inotify(7) 监视限制太低

如何在 C 中使用 inotify?

C程序使用inotify监视多个目录以及子目录?

inotify_add_watch 失败,没有这样的文件或目录