我在linux上使用记录器
记录器在init上打开一个文件
并在程序运行时写入该文件描述符
如果在创建文件描述符后将删除日志文件,
不会检测到异常/错误
我试过了:
out.fail()
!out.is_open()
我有谷歌这个并找到这篇文章 http://www.daniweb.com/forums/thread23244.html
所以我现在明白,即使使用rm删除了文件。它仍然存在,它只是没有联系 什么是解决这个问题的最好方法? 1.这是一个日志应用程序,所以性能是一个问题,我不想在每次写入时使用stat() 2.我不在乎日志文件中的某些行是否会在开始时丢失 3.允许用户删除日志文件,开始新鲜。记录器应该重新打开文件。
答案 0 :(得分:6)
rm
文件为“unlinked”。
文件可以有多个名称。如果没有名字,没有人打开它,那么文件系统会回收它,它可以重用它所占用的空间。
Linux有一个名为inotify
的“观看”文件的API,但这会引发复杂性和竞争条件。
所以更大的问题是,还有谁在运行时删除此文件,为什么?说服他们不要!
答案 1 :(得分:1)
您在评论中说过,原因是允许用户删除日志文件,在这种情况下,您希望应用程序开始编写一个新文件。
处理此问题的传统UNIX机制是让程序安装一个信号处理程序(通常用于SIGHUP
,因为对于守护程序来说没有任何意义)。信号处理程序包含使程序关闭并重新打开日志文件的代码。
然后指示用户在删除日志文件后,需要向程序发送SIGHUP
。
答案 2 :(得分:0)
处理此问题的唯一合理方法是尝试写入日志。如果写入失败(大多数情况下它不会),那么你需要找出原因。此时你可以做一些事情,比如使用stat查看日志是否仍然存在 - 如果是,你有某种磁盘已满或权限错误,这可能很难或无法恢复,如果不是,重新打开并重新尝试写入。