2012-11-30 16 views
10

Gibt es eine Haskell-Bibliotheksfunktion, um eine Datei ohne Polling zu überwachen?Haskell: Eine Datei ohne Polling überwachen (à la inotify in linux)

Mit Polling würde ich sowas wie folgt tun:

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 

Was ich will, ist so etwas wie eine Blockierung getModificationTime die durch das System aufgeweckt wird. Ist etwas verfügbar?

würde ich vollkommen zufrieden sein, wenn es nur für Posix-Systeme zur Verfügung, aber die mehr tragbar, desto besser :-)

Edit: Ich weiß hinotify, aber ich bin auf einem Mac (das ist warum erwähne ich POSIX).

+3

Ein Wrapper um 'hinotity' und' kqueue' kann je nach Plattform interessant sein. – singpolyma

+0

Interessante Frage. Sorry zu _me too_ this, gibt es irgendetwas unter Windows? – AndrewC

Antwort

5

Das Paket vorgeschlagen von Sjoerd Visscher wirkt wie ein Zauber (mit GHC 7.0.3 und 0.1.2.4 kqueue, Mac OS X 10.6 Snow Leopard).

ich eine schnelle Probe kompiliert es mit (da ich nicht API-Dokumentation finden konnte, aber es gibt einige Beispiele auf Github up):

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 

Dies wird ein kleines Programm erstellen, die Sie Dateipfade auf als passieren kann Argumente und überwachen diese Dateien. Die Ereignisse werden durch einen MVar zurückgeliefert und durch den Haupt-Thread gelesen, der im Grunde eine Schleife ist, die durch listen implementiert wird. Das Programm muss unter Verwendung ^C getötet werden, da es für immer ausgeführt wird.

6

Es gab ein GSoC-Projekt, das zum fsnotify-Paket führte, das systemspezifische Bibliotheken verwendet und auf Abfragen zurückgreift. Es verwendet hfsevents auf Mac.

+0

scheint eine nette Bibliothek zu sein. Ich habe versucht, es zu bauen und zu installieren (GHC 7.0.3, Mac OS X 10.6), aber es hat nicht funktioniert, aufgrund eines Problems mit hfsevents. Also werde ich bei der obigen Lösung bleiben. – scravy

+0

Es wäre großartig, wenn du einen Fehlerbericht mit dem Betreuer von hfsevents einreichen könntest, damit er es beheben kann. –