10

System.INotifySystem.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あるいは、現在の状態のファイルのスナップショットを安全な方法で取得する関数を作成することは可能でしょうか?

4

1 に答える 1

9

ByteString著者は、それをプレーン(IOなし)として表示できる持ち上げられた関数内でも値が変更される可能性があることを意味していると思います。

メモリ マップ ファイルは、メモリの領域です。パフォーマンス上の理由から、コンテンツを前後にコピーすることはあまり意味がありません (そうしないと、単純な古いストリームベースの I/O を実行できます)。したがって、取得している ByteString はライブです。

スナップショットが必要な場合は、ストリームベースの I/O を使用してください。ファイルの読み取りとは、メモリ内にファイルのスナップショットを作成することです。ForeignPtr別の方法は、参照透過性の警告を表示しないインターフェイスを使用することだと思います。私は ForeignPtrs に詳しくないので、動作することを保証できませんが、有望に見えますので調査します。

ByteStringを呼び出すこともできmap idますが、元のコピーとは異なるコピーを取得できるとは限りません。

必須のファイル ロックは、特に Linux では避けた方がよい混乱です。アドバイザリ ファイルのロックは問題ありませんが、誰も使用していないため、事実上存在しません。

于 2012-07-01T18:52:33.183 に答える