Haskell:用于多个句柄的openFile(W + R + R + R ...)没有"文件被锁定"

osh*_*hko 6 haskell locking

我正在Haskell(pub/sub + storage)中处理文件支持的队列.

我的想法是有一个带有W + R + R + R句柄的日志文件:

  • pub:一个W句柄,用于写/附加
  • sub:多个R用于拖尾和随机搜索过去的条目

但是,打开两个句柄(R + W)到同一个文件不适用于GHC:

#!/usr/bin/env stack
-- stack --resolver lts-13.0 --install-ghc runghc

module Main where

import System.IO

main :: IO ()
main = do
  let path = "file.txt"

  _ <- openFile path WriteMode
  _ <- openFile path ReadMode -- throws *** Exception: file.txt: openFile: resource busy (file is locked)
  _ <- openFile path ReadMode
  _ <- openFile path ReadMode

  return ()
Run Code Online (Sandbox Code Playgroud)

文件锁定部分开始承诺:

实现应该尽可能地强制执行,至少在本地Haskell进程,多读取器单写入器锁定文件.

......然后说:

也就是说,管理输入的同一文件上可能有许多句柄,或者管理输出的文件上只有一个句柄.

问题:

  • 为什么会有这样的限制?
  • 如何在Haskell/GHC中为文件设置W + R + R + R句柄?