假设长时间运行的进程写入日志文件。假设日志文件无限期地保持打开状态。假设一个粗心的系统管理员删除该日志文件。程序是否可以检测到发生了这种情况?在POSIX系统上检测到该日志文件已被删除或截断?
是否安全地假设fstat()
将报告已删除文件的链接计数为零?
截断,在我看来,有点棘手。部分取决于文件描述符是否在O_APPEND
模式下运行。如果日志文件未与O_APPEND
一起运行,那么程序日志描述符的当前写入位置不会改变,并且截断将删除前导字节,但程序将继续在“结束”处写入,从而留下幻影间隙零字节(它们读为零,但不一定占用磁盘空间)。
如果程序以O_APPEND
运行,那么它将在文件末尾写入当前存在的文件末尾。观察截断的唯一方法是注意文件位置不在程序期望的位置 - 这又意味着明确跟踪该位置。
整体而言,我并不担心截断与删除一样,但任何想法都会受到欢迎。
如何锁定而不是检测删除? – 2009-01-20 17:02:08
@snot:我不明白这会有多大帮助。咨询锁定将被忽略;强制锁定是不寻常的 - 不是不可能的,但我不想。另外,应允许管理员在合理范围内操作日志。这可能是软件需要更好的“更改日志文件”机制。 – 2009-01-20 17:59:56
文件名只是指向文件的指针,当没有指向文件时它将被删除。既然你总是可以添加一个链接然后删除另一个链接计数可能没有帮助,你可以做的最好的办法是检查文件名是否仍然存在,或者如果你的过程是唯一一个链接到文件。 – 2009-01-20 18:28:07