【问题标题】:Atomicity with openTempFileopenTempFile 的原子性
【发布时间】:2011-05-11 07:09:02
【问题描述】:

我有以下功能:

safeWrite :: Text -> IO ()
safeWrite c = bracket (openTempFile "/tmp" "list.tmp")
    (\(path, h) -> hClose h
      >> copyFile path dataFile
      >> removeFile path)
    (\(_, h) -> TI.hPutStr h c)

我的印象是这样是安全的,如果任何时候出现错误都不会发生复制,并且原始文件仍然可以使用。然而就在昨天,我得到了一个空文件,我不知道去哪里看它。该程序已经运行了一个多月,没有任何问题,这表明我没有想到一些极端情况。

该方法是否保证原子性,这意味着错误在其他地方,或者如果没有,为什么不呢?我应该怎么做才能保证原子性?

【问题讨论】:

    标签: file haskell io temporary-files


    【解决方案1】:

    您对 mkTemp 的定义是相对于 Haskell 异常的原子。如果出现异常,它将打印有关失败的消息(将文件留在那里)。

    • 对于 Unix 文件系统而言,它不是原子的——其他程序可以覆盖同一个文件
    • 如果出现故障,它不会清理。

    您可以做更多的清理工作,如果出现异常,可以选择删除文件,或者简单地使用提供的(原子)mkTemp 函数:

    或使用posix层:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多