Haskell: Мониторинг файла без опроса (например, inotify в linux)
Существует ли функция библиотеки haskell для мониторинга файла без опроса?
С опросом я бы сделал что-то вроде этого:
monitor file mtime handler = do
threadDelay n -- sleep `n` ns
t <- getModificationTime file
if t > mtime
then handler >> monitor file t handler
else monitor file mtime handler
То, что я хочу, это что-то вроде блокирующего getModificationTime, который будет разбужен системой. Есть ли что-то доступное?
Я был бы совершенно счастлив, если бы он был доступен только для систем posix, но чем более портативен, тем лучше:-)
Изменить: я знаю hinotify, но я на Mac (поэтому я упоминаю POSIX).
3 ответа
Пакет kqueue должен сделать это: http://hackage.haskell.org/package/kqueue
Пакет, предложенный Sjoerd Visscher, работает как шарм (используя GHC 7.0.3 и kqueue 0.1.2.4, Mac OS X 10.6 Snow Leopard).
Я скомпилировал быстрый пример, используя его (поскольку я не мог найти документацию по API, но на github есть несколько примеров):
import Control.Concurrent.MVar
import System.KQueue.HighLevel (watchFile, EventType, Watcher)
import System.Environment (getArgs)
watch :: MVar EventType -> FilePath -> IO Watcher
watch chan file =
let handler ev = putMVar chan ev
in watchFile file handler
listen :: MVar EventType -> IO ()
listen chan = takeMVar chan >>= print >> listen chan
main :: IO ()
main = do
args <- getArgs
chan <- newEmptyMVar
mapM (watch chan) args
listen chan
Это создаст небольшую программу, в которой вы можете передавать пути к файлам в качестве аргументов и отслеживать эти файлы. События возвращаются через MVar
и читается основным потоком, который в основном представляет собой цикл, реализованный listen
, Программа должна быть убита с помощью ^C
так как он предназначен для вечной работы.