Мониторинг файлов асинхронно - PullRequest
0 голосов
/ 25 февраля 2012

В Unix: я прошел через FAM и Gamin, и оба, похоже, предоставляют систему мониторинга файлов клиент / сервер. Я предпочел бы иметь систему, где я говорю ядру следить за некоторыми inode, и оно отталкивает меня назад, когда происходят события. Inotify сначала выглядело многообещающе с этой стороны: inotify_init1 позвольте мне пройти IN_NONBLOCK, что, в свою очередь, заставило poll() вернуться напрямую. Однако я понимал, что мне придется регулярно звонить, если я хочу получать новости об отслеживаемых файлах. Теперь мне не хватает идей.

Есть ли что-то для асинхронного мониторинга файлов?

PS: я еще не смотрел на Windows, но я бы тоже хотел получить ответы на этот вопрос.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Как говорит Селада в комментариях выше, inotify и poll являются правильным способом сделать это.

Сигналы не являются механизмом для разумного асинхронного программирования - и обработчики сигналов чрезвычайно опасны для неопытного и дажедля опытных.Никто не использует их для таких целей добровольно.

Вместо этого следует структурировать свою программу вокруг цикла событий (полное объяснение см. http://en.wikipedia.org/wiki/Event-driven_programming), используя poll, select или какой-либо аналогичный системный вызов.в качестве ядра механизма обработки событий вашей программы.

В качестве альтернативы вы можете использовать потоки или потоки плюс цикл обработки событий.

0 голосов
/ 28 февраля 2012

Как бы ни были интересны ваши ответы, извините, но я не могу принять механизм, основанный на блокировке вызовов при опросе или выборе, когда вопрос задается «асинхронно», независимо от того, насколько он скрыт.

С другой стороны, я обнаружил, что можно асинхронно запускать inotify, передав inotify_init1 флаг IN_NONBLOCK. Сигналы не запускаются, как это было бы с aio, а вызов read, который блокировал бы блокировку, установил бы errno в EWOULDBLOCK.

...