Reh*_*que 10 io file-io haskell mmap virtual-memory
我希望一起使用System.INotify和System.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
以安全的方式获取当前状态文件快照的函数?
我认为作者意味着即使在一个可以将其视为普通ByteString
(无IO)的提升函数中,该值也可以改变.
meory映射文件是内存区域.出于性能原因,来回复制其内容没有多大意义(否则可以只进行普通的基于流的I/O).所以你得到的ByteString是实时的.
如果要创建快照,只需使用基于流的I/O. 这就是读取文件的作用:在内存中创建文件快照!我想另一种方法是使用ForeignPtr
不带参考透明度警告的界面.我不熟悉ForeignPtrs所以我不能保证它会起作用,但它看起来很有希望,我会调查它.
您也可以尝试调用map id
ByteString但不保证您将获得与原始文件不同的副本.
强制文件锁定,特别是在Linux上,是一个混乱,更好地避免.咨询文件锁定没问题,除了没有人使用它,所以它实际上不存在.