C-программа, использующая inotify, помогает в понимании кода

Я ссылался на справочную страницу для inotify, и я наткнулся на этот кусок кода

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

где событие является указателем на структуру inotify_event,

  • Я не мог понять эту конкретную строку if (event->mask & IN_ISDIR) и почему bitwise AND используется здесь.

  • Как было установлено, что bitwise AND предполагается использовать здесь и ничего больше? Это не было упомянуто в справочной странице для inotify.

2 ответа

Решение

Это побитовое И маскирует определенный бит (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), либо 0x40000000, если переменная имеет 1 в том же месте. Любое ненулевое значение считается "истинным".

Логично, что это тестирование, если event был из каталога (а не из файла).

Побитовое И - это простой (и очень распространенный) способ проверить, установлен ли определенный бит. Страница man ясно, что если этот бит установлен, то событие ссылается на каталог.

Другие вопросы по тегам