假設長時間運行的進程寫入日誌文件。假設日誌文件無限期地保持打開狀態。假設一個粗心的系統管理員刪除該日誌文件。程序是否可以檢測到發生了這種情況?在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