Haskell中的引用透明度和mmap

Reh*_*que 10 io file-io haskell mmap virtual-memory

我希望一起使用System.INotifySystem.IO.MMap来监视文件修改,然后快速执行差异以通过网络发送补丁.但是,在System.IO.MMap的文档中,有一些关于引用透明性的警告:

文件说明

如果您知道自己是唯一的用户,那么mmap文件是安全的.否则参考透明度可能会或可能不会受到影响.遗憾的是,语义在操作系统之间存在很大差异.

MMap返回的值,IO ByteString当我使用这个值时,putStr我每次都期望得到不同的结果吗?我假设作者意味着值可能会在IO操作期间发生变化,例如putStr崩溃?

编辑开始:想想看,我想这个问题的答案有点明显......如果在取消装箱后任何时候价值发生变化都会有问题.

do 
  v <- mappedValue :: IO ByteString
  putStr v
  putStr v  -- Expects the same value of v everywhere
Run Code Online (Sandbox Code Playgroud)

END-OF-EDIT

难道不可能在映射区域或文件上获得某种锁定吗?

或者,是否可以编写一个copy :: IO ByteString -> IO ByteString以安全的方式获取当前状态文件快照的函数?

n. *_* m. 8

我认为作者意味着即使在一个可以将其视为普通ByteString(无IO)的提升函数中,该值也可以改变.

meory映射文件是内存区域.出于性能原因,来回复制其内容没有多大意义(否则可以只进行普通的基于流的I/O).所以你得到的ByteString是实时的.

如果要创建快照,只需使用基于流的I/O. 这就是读取文件的作用:在内存中创建文件快照!我想另一种方法是使用ForeignPtr不带参考透明度警告的界面.我不熟悉ForeignPtrs所以我不能保证它会起作用,但它看起来很有希望,我会调查它.

您也可以尝试调用map idByteString但不保证您将获得与原始文件不同的副本.

强制文件锁定,特别是在Linux上,是一个混乱,更好地避免.咨询文件锁定没问题,除了没有人使用它,所以它实际上不存在.

  • 我想这下意识地说我的操作系统有点太多了.基本上,我希望将文件视为多个进程之间非常快速的共享内存缓存,让操作系统可以随意刷新磁盘更改.仔细考虑它我认为除非所有进程明确使用共享内存映射,否则这似乎不太可行. (2认同)