【问题标题】:ofstream - detect if file has been deleted between open and closeofstream - 检测文件是否在打开和关闭之间被删除
【发布时间】:2011-01-13 00:33:59
【问题描述】:

我正在 Linux 上编写记录器。
记录器在初始化时打开一个文件。
并在程序运行时写入该文件描述符。
如果创建文件描述符后日志文件将被删除,
不会检测到异常/错误。
我试过了:

out.fail()
!out.is_open()

我在谷歌上找到了这个帖子。
http://www.daniweb.com/forums/thread23244.html

所以我现在明白了,即使文件是使用 rm 删除的。它仍然存在,只是取消了链接。
处理这个问题的最佳方法是什么?
1. 这是一个日志应用程序,所以性能是一个问题,我不想在每次写入时都使用 stat()
2. 我不在乎日志文件中的某些行是否会在开始时丢失
3.允许用户删除日志文件,重新开始。记录器应该重新打开文件。

【问题讨论】:

  • 你用什么函数写入文件?例如。对于 fwrite,您可以测试返回结果。如果大小与预期不同,则重新打开(创建)文件..
  • @Dyatlov 测试结果不会有帮助,因为文件存在它只是取消链接,写入 succssed.so 会检查文件大小,谢谢
  • 我在调查同一个问题时遇到了这个问题,除了删除的过程是 logrotate -- 我的情况更容易修复 -- logrotate 有一个选项 -- copytruncate -- 这将解决这个问题通过根本不删除文件来记录日志问题。

标签: c++ linux file


【解决方案1】:

文件是 rm 的“unlinked”。

一个文件可以有多个名称。当它没有名字,也没有人打开它时,它会被文件系统回收,它所占用的空间可以被重复使用。

Linux 有一个名为 inotify 的用于“监视”文件的 API,但这会带来复杂性和竞争条件。

所以更大的问题是,还有谁在运行这个文件时删除它,为什么?说服他们不要!

【讨论】:

  • 我们的系统允许用户删除日志文件,这样他就可以重新开始,这是我们系统的工作方式,我无法更改:(
  • 那么您需要为用户提供一个程序来向记录器发送“截断”消息,而不是在文件系统上手动删除。你需要改变一些东西,目前的方法不会按设计工作。
  • inotify 可能是解决这个问题的最佳方法,即使它很复杂。
  • 防止用户删除日志文件(必要时可以提供一些尖锐的东西)。要重置/清除日志文件,请执行“cat /dev/null > logfile”。
【解决方案2】:

您已在 cmets 中声明,这样做的原因是允许用户删除日志文件,在这种情况下,您希望应用程序开始在其位置写入一个新文件。

处理此问题的传统 UNIX 机制是让您的程序安装一个信号处理程序(通常用于SIGHUP,否则这对守护进程毫无意义)。信号处理程序包括使程序关闭并重新打开日志文件的代码。

然后指示用户在删除日志文件后,需要向程序发送SIGHUP

【讨论】:

    【解决方案3】:

    处理此问题的唯一明智方法是尝试写入日志。如果写入失败(大多数情况下不会),那么您需要找出原因。那时你可以做一些事情,比如使用 stat 查看日志是否仍然存在 - 如果是,你有某种磁盘已满或权限错误,这可能很难或不可能从中恢复,如果不是,重新打开并重新尝试写入。

    【讨论】:

    • @Neil rm 并没有真正删除文件,它只是取消链接。该文件仍然存在并被应用程序使用,写入将成功。所以检查错误无济于事
    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多