2012-11-30 2 views
10

폴링없이 파일을 모니터링하는 haskell 라이브러리 기능이 있습니까?Haskell : 폴링하지 않고 파일 모니터링 (리눅스에서 à la inotify)

폴링와 내가 같이가 someting 할 것 : 내가 원하는 것은 시스템에 의해 깨어됩니다 차단 getModificationTime 같은 것이

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 

입니다. 사용할 수있는 것이 있습니까?

내가 완벽하게는 POSIX 시스템에 사용할 수 있다면 행복하지만, 더 많은 휴대용 될 것이다 :-) 더 나은

편집 : 내가 hinotify을 알고,하지만 난 (그건 맥에있어 왜 내가 POSIX를 언급하는지).

+3

플랫폼에 따라'hinotity'와'kqueue'를 둘러싼 래퍼가 흥미로울 수 있습니다. – singpolyma

+0

흥미로운 질문입니다. 죄송합니다. _ me _ 너무 _ _ _ _ _ _ _ _ 무엇입니까? – AndrewC

답변

5

[패키지는 (GHC 7.0.3 및 kqueue 0.1.2.4, 맥 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 

이것은 당신이뿐만에 filepaths를 전달할 수있는 작은 프로그램을 작성합니다 인수를 수집하고 이들 파일을 모니터하십시오. 이벤트는 MVar을 통해 피드백되고 기본적으로 listen에 의해 구현되는 루프 인 메인 스레드가 읽습니다. 프로그램은 영원히 실행되도록 설계 되었기 때문에 ^C을 사용하여 종료해야합니다.

6

시스템 별 라이브러리를 사용하는 fsnotify 패키지의 결과 인 GSoC 프로젝트가 있었고 폴링으로 되돌아갔습니다. Mac에서는 hfsevents을 사용합니다.

+0

좋은 라이브러리가 될 것 같습니다. 나는 그것을 구축하고 설치하려고 시도했지만 (GHC 7.0.3, Mac OS X 10.6) hfsevents의 문제로 인해 작동하지 않았습니다. 그래서 위의 해결책을 고수 할 것입니다. – scravy

+0

hfsevents 관리자에게 버그 리포트를 보내서 고칠 수 있다면 좋을 것입니다. –