Как получать уведомления об изменении файла/каталога в C/C++, в идеале с использованием POSIX

Тема говорит сама за себя - обычно простой и кросс-платформенный способ - разумно опросить. Но у каждой ОС есть средства для уведомления без опроса. Возможно ли это разумно кросс-платформенным способом? (Меня действительно интересуют только Windows и Linux, но я использую Mac, поэтому я подумал, что posix может помочь?)


person Michael Neale    schedule 14.09.2008    source источник


Ответы (7)


Пользователи Linux могут использовать inotify.

inotify — это подсистема ядра Linux, которая обеспечивает уведомление о событиях файловой системы.

Некоторые плюсы для Windows-соратников:

person aku    schedule 14.09.2008
comment
да, я смог заставить его работать для этого. Это немного странно, с блокирующим read() - но, по крайней мере, здесь нулевая задержка (скорее, нет опроса!). - person Michael Neale; 15.09.2008

В библиотеке Qt есть класс QFileSystemWatcher, который обеспечивает межплатформенные уведомления при изменении файла. . Даже если вы не используете Qt, поскольку исходный код доступен, вы можете взглянуть на него как на образец для своей собственной реализации. Qt имеет отдельные реализации для Windows, Linux и Mac.

person David Dibben    schedule 14.09.2008
comment
Я нашел это полезным и для его исходного кода: github.com/emcrisostomo/fswatch - person wcochran; 01.03.2019

Существует API событий файловой системы леопарда.

person macbirdie    schedule 14.09.2008

Я не думаю, что у самого POSIX есть для этого средства. Самый близкий к кросс-платформе, который я видел, это FAM, который, кажется, работает для Linux. , BSD и Irix, но я не представляю, насколько просто было бы портировать его на Windows и MacOS.

person Chris Jester-Young    schedule 14.09.2008

На самом деле я построил эту систему раньше для использования в коммерческой базе кода C++ - пока вам не нужны все странные вещи под солнцем, системы Windows и POSIX имеют много совпадений, которые вы можете абстрагировать.

POSIX: используйте inotify — это целая система, буквально построенная для этой работы.
Windows: используйте «события изменений». Вам нужно создать больше клея и отчетов самостоятельно (все необходимые API-интерфейсы доступны, просто нет универсальной покупки, которую дает вам inotify).

Общие вещи, которые вы можете обнаружить в своем «потоке уведомлений» для пересылки событий:
1) В основном любая инвазивная операция boost::filesystem поддерживает, с (возможным) исключением изменения разрешений. Это такие вещи, как перемещение, создание, удаление, копирование папок и файлов.
2) Чтение и запись в файлы (особенно запись). Имейте в виду, что если вы используете асинхронный ввод-вывод, уведомления могут отображаться не по порядку.
3) Когда поступает новый том, например, кто-то подключает флэш-накопитель.

inotify особенно дает вам безумный уровень детального контроля, в отличие от Windows. С помощью inotify вы можете буквально отслеживать все, что делает файловая система, почти в реальном времени, если вы действительно этого хотите. Я знаю, что № 3 возможен с обоими без опроса, но имейте в виду, что может быть очень сложно заставить его работать правильно - в любой системе.

person Zack Yezek    schedule 20.12.2013

Я считаю, что в OS X теперь есть соответствующие хуки/обратные вызовы, потому что они были необходимы для индексации Spotlight.

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

person Matthias Winkelmann    schedule 14.09.2008

libevent или libev кажется тем, что вам нужно, хотя я их не использовал.

person paleozogt    schedule 14.04.2009
comment
ни одна из этих библиотек не делает то, о чем просил OP - это библиотеки для создания даже управляемого программного обеспечения - например, неблокирующие сетевые операции ввода-вывода. - person Laurent Demailly; 11.07.2015