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 ясно, что если этот бит установлен, то событие ссылается на каталог.