openTempFile 的原子性

发布于 2024-11-06 08:42:42 字数 440 浏览 3 评论 0原文

我有以下功能:

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

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

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

I have the following function:

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

I was under the impression that this would safe, no copying would happen if there were errors during any moment, and the original file would still be usable. However just yesterday I ended up with an empty file, and I have no idea where to go look at it. The program had been running well for over a month without any hiccups which points so some corner case I didn't think of.

Does the method guarantee atomicity, meaning the error is somewhere else, or if not, why not? What should I do to guarantee atomicity?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傻比既视感 2024-11-13 08:42:42

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

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

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

或使用 posix 层:

Your definition of mkTemp is atomic with respect to Haskell exceptions. If there is an exception it will print a message about the failure (leaving the file there).

  • It is not atomic with respect to the Unix file system -- other programs could overwrite the same file
  • It does not clean up should there be a failure.

You can do a bit more to clean up, by optionally removing the file if there is an exception, or simply using the provided (atomic) mkTemp function:

or using the posix layer:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文