10

ポーリングせずにファイルを監視する 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 について言及しています)。

4

3 に答える 3

10

kqueue パッケージはこれを行う必要があります: http://hackage.haskell.org/package/kqueue

于 2012-11-30T10:35:04.623 に答える
7

システム固有のライブラリを使用し、ポーリングにフォールバックするfsnotifyパッケージをもたらした GSoC プロジェクトがありました。Macではhfseventsを使用します。

于 2012-12-01T17:12:25.777 に答える
5

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永久に実行されるように設計されているため、を使用して強制終了する必要があります。

于 2012-11-30T22:05:52.947 に答える