System.INotifyとSystem.IO.MMapを一緒に使用して、ファイルの変更を監視し、ネットワーク経由でパッチを送信するための差分をすばやく実行することを望んでいました。ただし、System.IO.MMapのドキュメントには、参照透過性に関するいくつかの警告があります。
ドキュメントの状態
自分が唯一のユーザーであることがわかっている場合にのみ、ファイルを mmap しても安全です。そうしないと、参照透過性が損なわれる場合と、損なわれない場合があります。残念ながら、セマンティクスはオペレーティング システムによって大きく異なります。
MMap が返す値はです。IO ByteString
この値を使用すると、putStr
毎回異なる結果が期待されますか? putStr
作成者は、クラッシュなどの IO 操作中に値が変更される可能性があることを意味していると思いますか?
START-OF-EDIT: 考えてみると、質問のこの部分への答えはやや明白だと思います...開封後に値がいつでも変更されると、問題が発生します。
do
v <- mappedValue :: IO ByteString
putStr v
putStr v -- Expects the same value of v everywhere
編集終了
マップされた領域またはファイルに対してある種のロックを取得することは可能ではないでしょうか?
copy :: IO ByteString -> IO ByteString
あるいは、現在の状態のファイルのスナップショットを安全な方法で取得する関数を作成することは可能でしょうか?