Можно ли использовать inotify для отслеживания создания определенного файла без мониторинга всего каталога?

9

Я хочу получать уведомления при создании конкретного имени файла. Я смотрю inotify. IN_CREATEФлаг доступен для мониторинга каталога для любых изменений в нем, но я предпочел бы не контролировать весь каталог , так как там может быть много деятельности в этом каталоге , кроме файла я заинтересован в. Можно ли это сделать ?

BobDoolittle
источник
3
Я предполагаю, что ответ «нет». По крайней мере, не с inotify. Если вы можете контролировать местоположение файла, вам лучше создать специальный каталог для него, чтобы вы могли отслеживать каталог, не отвлекаясь на отвлекающие факторы. Если вы не можете контролировать местоположение, вы сталкиваетесь либо со сравнением возвращенного поля 'name' с (относительным) именем вашего файла, либо с вызовом чего-то вроде accessс, F_OKчтобы узнать, существует ли оно еще.
BobDoolittle

Ответы:

7

Вы не можете заставить ядро ​​только сообщать вам об изменении определенного пути. Причины немного тонкие:

  • В Linux файловый объект существует независимо от любых имен, которые он может иметь. Имена файлов на самом деле являются атрибутами их содержащей директории, и один файл может вызываться несколькими именами (см., Жесткая ссылка).

  • Ядро должно иметь что-то для прикрепления объектов inotify; он не может прикрепить объект к путевому файлу, поскольку он не является реальным объектом файловой системы; Вы должны прикрепить к родительскому каталогу или файлу, который описывает путь. Но вы не можете присоединиться к файлу, потому что вы смотрите, чтобы создать файл с заданным именем, а не изменить его.

Теоретически, ядро ​​может реализовать API, который позволяет выбирать события для заданного пути при добавлении часов в каталог, почти так же, как он позволяет выбирать типы событий. Это раздуло бы API, и ядро ​​в конце концов обработало бы те же данные и выполнило бы то же сравнение строк, что и в пользовательском пространстве.

Заметно ли снижение производительности при размещении часов в очень активном каталоге? Я не уверен, насколько вы активны; десятки файлов в секунду, сотни, миллионы?

В любом случае, я бы избегал access: это всегда будет гонкой. Файл может быть создан и удален между вызовами access, и вызов accessв очень узком цикле будет медленным, и это та проблема, которую inotifyнужно решить.

Дилан Фрезе
источник
Если я не могу быть проинформирован об «изменении определенного пути», как вообще работает inotify? Возможно, вы имеете в виду пути к файлам, а не пути к каталогам?
BobDoolittle
Кроме того, преимущество выполнения проверки в ядре, а не в пользовательском пространстве, заключается в том, что существует несколько процессов, отслеживающих каталог. Вместо того, чтобы переключать их все без необходимости и сравнивать их все, вы можете просто переключиться в процессе, который действительно заботится о пути к файлу.
BobDoolittle
Я имел в виду, что при мониторинге каталога (который, очевидно, задается путем), вы не можете указать ядру выбирать только события с данным именем (так что да, я имею в виду пути к «файлу»). Я понимаю теоретические преимущества не пробуждения множества процессов, но я должен снова спросить, пытались ли вы использовать inotify, и была ли проблема производительности реальной.
Дилан Фрезе
1
В качестве альтернативы, если многие процессы заинтересованы в определенных событиях, у вас может быть один процесс, отслеживающий имена файлов и отправляющий «интересные» события через нечто вроде сокета UNIX в процессы, действительно заинтересованные в этих событиях (как своего рода сервис).
Дилан Фрезе
Проблемы с производительностью могут быть чрезвычайно трудно измерить и диагностировать. Вместо того, чтобы ходить в кирпичные стены, я предпочитаю в первую очередь применять хорошие методы программирования, разрабатывать программное обеспечение, которое использует хорошие шаблоны проектирования, и избегать таких ситуаций. Так что нет, я не заметил проблемы. Я предвидел потенциальную проблему и избегал использования inotify в этом случае из-за потенциальных проблем в будущем. Как сам разработчик системного программного обеспечения, я верю в создание надежных механизмов, помогающих людям избежать проблем с производительностью, что является целью inotify.
BobDoolittle