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

Был проект GSoC, который привел к созданию пакета fsnotify, который использует системные библиотеки и возвращается к опросу. Он использует hfsevents на Mac.

Пакет, предложенный 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 так как он предназначен для вечной работы.

Другие вопросы по тегам