2012-11-30 10 views
10

Esiste una funzione di libreria haskell per monitorare un file senza polling?Haskell: monitora un file senza polling (à la inotify in linux)

Con polling farei someting in questo modo:

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 

Quello che voglio è qualcosa di simile a un getModificationTime blocco che sarà svegliato dal sistema. C'è qualcosa disponibile?

sarei perfettamente felice se fosse disponibile solo per i sistemi POSIX, ma il più portabile e meglio :-)

Edit: Lo so hinotify, ma sono su un Mac (che è perché menziono POSIX).

+3

Un involucro intorno a 'hinotity' e' kqueue' a seconda della piattaforma potrebbe essere interessante. – singpolyma

+0

Interessante domanda. Scusa anche per me, c'è qualcosa su Windows? – AndrewC

risposta

5

Il pacchetto proposto da Sjoerd Visscher funziona come un fascino (utilizzando GHC 7.0.3 e 0.1.2.4 kqueue, Mac OS X 10.6 Snow Leopard).

ho compilato un campione rapido utilizzo (dato che non riuscivo a trovare la documentazione API, ma ci sono alcuni esempi su 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 

Questo creerà un piccolo programma che è possibile passare filepaths come argomenti e monitorare questi file. Gli eventi vengono reindirizzati attraverso un MVar e letti dal thread principale che è fondamentalmente un ciclo implementato da listen. Il programma deve essere ucciso utilizzando ^C poiché è progettato per funzionare per sempre.

6

C'è stato un progetto GSoC che ha portato al pacchetto fsnotify che utilizza librerie specifiche del sistema e torna al polling. Usa hfsevents su Mac.

+0

sembra essere una bella libreria. Ho provato a installarlo e installarlo (GHC 7.0.3, Mac OS X 10.6) ma non ha funzionato, a causa di un problema con hfsevents. Quindi ho intenzione di rimanere con la soluzione di cui sopra. – scravy

+0

Sarebbe bello se si potesse presentare una segnalazione di bug con il manutentore di hfsevents in modo che potesse ripararlo. –