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

时间:2010-02-04 10:31:36

标签: c++ linux file

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

out.fail()
!out.is_open()

我有谷歌这个并找到这篇文章 http://www.daniweb.com/forums/thread23244.html

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

3 个答案:

答案 0 :(得分:6)

rm文件为“unlinked”。

文件可以有多个名称。如果没有名字,没有人打开它,那么文件系统会回收它,它可以重用它所占用的空间。

Linux有一个名为inotify的“观看”文件的API,但这会引发复杂性和竞争条件。

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

答案 1 :(得分:1)

您在评论中说过,原因是允许用户删除日志文件,在这种情况下,您希望应用程序开始编写一个新文件。

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

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

答案 2 :(得分:0)

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