代码之家  ›  专栏  ›  技术社区  ›  jojo

ofstream-检测文件是否在打开和关闭之间被删除

  •  4
  • jojo  · 技术社区  · 15 年前

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

    out.fail()
    !out.is_open()
    

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

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

    3 回复  |  直到 11 年前
        1
  •  6
  •   Will    15 年前

    文件是' unlinked rm .

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

    Linux有一个“监视”文件的API inotify ,但这正吸引着复杂性和竞争条件。

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

        2
  •  1
  •   caf    15 年前

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

    处理这个问题的传统Unix机制是让程序安装一个信号处理程序(通常用于 SIGHUP ,因为这对守护进程没有意义)。信号处理程序包含使程序关闭并重新打开日志文件的代码。

    然后提示用户在删除日志文件后,需要发送 叹息 对程序。

        3
  •  0
  •   anon    15 年前

    处理这种情况的唯一合理方法是尝试写入日志。如果写失败(大多数情况下不会),那么您需要找出原因。在这一点上,您可以使用stat来查看日志是否仍然存在——如果仍然存在,则会出现某种磁盘已满或权限错误,这可能很难或不可能从中恢复,如果没有,则重新打开并尝试写入。