Ответ 1
Пакет kqueue должен сделать это: http://hackage.haskell.org/package/kqueue
Есть ли библиотека библиотеки 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).
Пакет 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
, поскольку она предназначена для работы навсегда.