正如標題狀態後,被感動:你如何檢測你已經打開的文件已經打開
- 我的程序打開文件。
- 有東西出現,並移動該文件。 Inode應該是相同的,但名稱不同。
- 關閉該文件,然後刪除,但它不存在了
所以,我怎麼能檢測到它已被移動和刪除正確的文件名?
任何想法?
正如標題狀態後,被感動:你如何檢測你已經打開的文件已經打開
所以,我怎麼能檢測到它已被移動和刪除正確的文件名?
任何想法?
您可以使用inotify來檢測對舊名稱的更改(查找IN_MOVE_SELF事件)。但是,如果您的真正目標僅僅是刪除文件的名稱,則可以在打開文件後立即執行此操作(使用unlink(2))。 Unix文件語義將允許您繼續使用打開的文件,並且磁盤上的數據在您的句柄關閉之前不會真正刪除。然後沒有人能夠重命名文件。
解除鏈接的問題是競爭條件。如果在取消鏈接或完成之前移動文件,則不需要骰子。 – Jaime 2012-01-16 19:50:03
然後在打開它之前先移動文件。沒有人會知道這個新名字,然後你可以在最後打開並取消鏈接。如果這仍然不能解決您的問題,那麼您將不得不更詳細地描述您實際嘗試完成的任務。 – 2012-01-16 19:52:52
fstat
打開文件,stat
的名稱,並比較結果。
但是,與任何可能的檢查一樣,它仍然是活潑的;在您做出任何檢查之後但在您採取行動之前,名稱可能會改變含義。時間來重新審視你的要求。
您是否擔心跨文件系統移動(複製和刪除,inode未保留)和非inode文件系統(例如FAT)? – MSalters 2012-01-17 10:06:36