Получить полное имя пути из inotify_event - PullRequest
7 голосов
/ 16 февраля 2012

Структура inotify_event выглядит следующим образом:

struct inotify_event {
int      wd;       /* Watch descriptor */
uint32_t mask;     /* Mask of events */
uint32_t cookie;   /* Unique cookie associating related
                      events (for rename(2)) */
uint32_t len;      /* Size of name field */
char     name[];   /* Optional null-terminated name */

};

В части имени хранится только имя файла (не путь к файлу).Как мы можем получить полный путь из структуры inotify_event или мне нужно обернуть мою собственную структуру вокруг нее?

Редактировать: я жду события около 2 секунд, а затем обрабатываю его за один раз.очередь событий.У меня вопрос, могу ли я получить полный путь к своему файлу только из структуры inotify_event?

Количество событий в секунду велико.

Ответы [ 5 ]

5 голосов
/ 16 февраля 2012

Есть два варианта:

  1. Вы смотрите файл. Вы передали его имя inotify_add_watch и получили дескриптор часов. Если вы получили событие, вы можете выяснить файл по дескриптору часов.

  2. Вы смотрите каталог. Опять же, вы передали имя каталога в inotify_add_watch и можете узнать, какое это имя было, основываясь на ID наблюдения. Теперь inotify_event.name содержит имя файла. Соедините два, и все готово.

1 голос
/ 29 марта 2015

Свяжите (со структурой) полученные дескрипторы наблюдения с путем, который вы добавляете для наблюдения. Таким образом, вы создали список часов. Когда вы получаете событие, оно содержит дескриптор часов, таким образом, вы найдете путь, связанный с этим дескриптором часов, из списка часов. Объедините имя, которое вы получите из структуры события, с путем, который вы получите из списка часов. Также, когда вы добавляете путь для просмотра, в это время вы также рекурсивно добавляете все подпути так же, как вы добавили родительский путь .

1 голос
/ 10 февраля 2013

Я думаю, вам нужно отслеживать каждый из дескрипторов часов, когда вы добавляете их в некоторую структуру (все с полным путем, когда вы добавляете его). Затем, когда вы получите событие, ищите полный путь в этой структуре, используя wd в событии.

wd идентифицирует часы, для которых происходит это событие. Это один из посмотреть дескрипторы, возвращенные предыдущим вызовом inotify_add_watch (2).

http://www.kernel.org/doc/man-pages/online/pages/man7/inotify.7.html

Надеюсь, это поможет ...

0 голосов
/ 03 октября 2017

Система inotify, использует смежные числа в качестве дескрипторов просмотра, допустим, вы хотите просмотреть 3 каталога: ../A, ../B и ../C, если, скажем, я создаю файл внутри ../A, тогда возвращаемый дескриптор watch из read () будет равен 1., если я создам файл внутри ../C, дескриптор watch будет равен 3 и так далее. Таким образом, ассоциация довольно проста: вы можете создать массив с путями и применить inotify_add_watch () к каждому из них, а затем, если событие имеет дескриптор наблюдения x, просто собрать воедино pathsArray [x-1] с event-> name и у вас есть путь :)

std::string getPathFromEvent(struct inotify_event *ptr){
    std::stringstream builder ;
    builder<<directories->DetectedDirectories.operator[](ptr->wd-1).string();
    builder<<ptr->name;
    return builder.str();
}
0 голосов
/ 24 апреля 2013

Это нормально, насколько это возможно, но это не полный ответ.

Если у вас есть структура каталогов, и вы смотрите события file & dir, и она выглядит так: / root / dir1 & / root / dir2, то у вас не будет правильного разрешения того, где был файл или каталог.создается в dir1 или dir2 даже после добавления их в список наблюдения.

Inotify возвращает имя элемента и не сообщает вам, в каком каталоге он находился.

...