Haskell实现文件追加与断言测试时遇文件锁定问题求助
Haskell文件读写并发测试的资源锁定问题
我正在编写测试,测试场景如下:
- 向文件追加行
- 执行断言
- 再次追加行
- 再次执行断言
但在Haskell中实现这个简单场景时,总是遇到openFile: resource busy (file is locked)错误!我查过System.IO相关文档,但没搞懂问题出在哪。我在断言块里用ReadMode、非缓冲模式打开文件,同时用appendFile向文件追加新行——为什么这会被判定为不安全并锁定?这在其他语言里都是安全操作,肯定有办法绕过Haskell这个限制吧?
我试过自己实现appendFile,在末尾调用hFlush + hClose,本以为hClose会彻底关闭文件释放锁,但结果还是一样。另外,当我用其他应用(比如记事本)向文件追加内容时,断言代码能正常工作,这说明不是惰性求值的问题,而是Haskell这边的冗余锁定。
目前我只能想到在单元测试里调用echo "..." >> myfile这种shell命令,但有没有办法在同一个Haskell应用里,在文件以读模式打开的同时向其追加行,不用依赖shell的echo?
测试场景代码:
, testCase "common scenario" $ do withSystemTempDirectory "something" $ \tmpDir -> do let dir = P.absDir tmpDir f = dir </> P.relFile "my.log" f1 = P.toString f appendFile f1 "aaa\n" appendFile f1 "bbb\n" appendFile f1 "\n\n\n" appendFile f1 "ccc\n" appendFile f1 "ddd" fm <- myReader f ln <- myRead fm assertEqual "unexpected line" (Added "aaa") ln -- 我想在这里添加appendFile或类似有用的操作 ln <- myRead fm assertEqual "unexpected line" (Added "aaa") ln
内容的提问来源于stack exchange,提问作者RandomB
相关产品推荐
相关产品推荐

