微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ofstream – 检测文件是否在打开和closures之间被删除

我正在linux上logging一个logging器。

logging器在init上打开一个文件

并在程序运行时写入该文件描述符。

如果日志文件在创build文件描述符后被删除

没有exception/错误将被检测到。

我努力了:

out.fail() !out.is_open()

我有谷歌这个,并find这个职位。

http://www.daniweb.com/forums/thread23244.html

所以我现在明白,即使该文件是通过使用RM删除。 它还是存在的,它根本就是没有联系的。

处理这个问题的最好方法是什么?

1.这是一个日志应用程序,所以性能一个问题,我不想在每次写入时使用stat()

2.我不在乎日志文件中的某些行在开始时是否会丢失

3.用户被允许删除日志文件,重新开始。logging器应该重新打开文件

为什么MysqL服务器不把表格写入文件

fread()在fwrite()之后得到0个字节

使用shell添加文件名合并多个文件

Linux:列出文件名的唯一部分

如何在ruby中设置与Windows相关的文件属性

Windows上的文件是否具有编码属性

如何调用shell的“文件复制对话框”来报告在Win32中复制的进度?

如何设置文件的隐藏属性

Windowsbatch file – 显示所有子文件

File.copy以及作为stream打开的文件,并写入networking文件挂起到本地机器

文件被rm “ 取消关联 ”。

一个文件可以有很多名字。 如果没有名字,没有人打开,那么文件系统就会回收它,并且占用的空间可以被重新使用。

Linux有一个“监视” inotify文件的API,但是这是一个非常复杂的竞争条件。

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

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

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

然后指示用户删除日志文件后,需要发送一个SIGHUP给程序。

处理这个唯一明智的方法是尝试写入日志。 如果写入失败(大部分时间不会),那么你需要找出原因。 在这一点上,你可以做一些事情,比如使用stat来查看日志是否仍然存在 – 如果是的话,你有某种磁盘已满或许可错误,如果不是,重新打开并重新尝试写入。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐