В этом вопросе и с принятым ответом происходит слияние нескольких вещей.
Чтобы ответить на суть вопроса:
Если единственный процесс, который изменяет файлы в просматриваемомместоположение прервано, после чего вы можете прекратить работу, если в очереди inotify больше нет событий.Вы можете безопасно проверить размер, проверив FIONREAD
, как вы упомянули в вопросе.Чтобы это не пропустило ни одного события, вам необходимо точно знать, что процесс мутации определенно завершен с помощью других средств;критический аспект этого заключается в том, что вы не хотите завершать обработку очереди inotify, пока не завершится процесс мутации, и ваш процесс inotify получил SIGTERM
.
Однако, если вы не знаете,другой процесс завершен, но вы хотите убедиться, что события до текущего момента времени (например, при обнаружении SIGTERM
) были обработаны, вам нужно будет использовать метод, аналогичный тому, который использовался в watchman
.Идея состоит в том, что вы создадите специальный файл маркера с волшебным именем в наблюдаемом каталоге, когда ваш основной процесс будет остановлен.Затем вы продолжите обрабатывать события из очереди inotify, пока не увидите свое волшебное имя файла;в этот момент вы можете сказать, что все события до создания магического файла были использованы.Здесь есть больше информации об этой технике: https://facebook.github.io/watchman/docs/cookies.html (отказ от ответственности: я создатель сторожа)
Дискуссия о signalfd
против традиционной обработки сигналов ортогональна аспекту синхронизациивопрос: вы, конечно, можете использовать оригинальный интерфейс обработки сигналов posix и установить глобальную переменную, чтобы указать, что SIGTERM
был получен.Это ничего не меняет в последовательности или времени событий inotify, поэтому не стесняйтесь использовать любой метод, который вам нравится при реализации этого.