2012-01-16 166 views
1

正如標題狀態後,被感動:你如何檢測你已經打開的文件已經打開

  • 我的程序打開文件。
  • 有東西出現,並移動該文件。 Inode應該是相同的,但名稱不同。
  • 關閉該文件,然後刪除,但它不存在了

所以,我怎麼能檢測到它已被移動和刪除正確的文件名?

任何想法?

+0

您是否擔心跨文件系統移動(複製和刪除,inode未保留)和非inode文件系統(例如FAT)? – MSalters 2012-01-17 10:06:36

回答

2

您可以使用inotify來檢測對舊名稱的更改(查找IN_MOVE_SELF事件)。但是,如果您的真正目標僅僅是刪除文件的名稱,則可以在打開文件後立即執行此操作(使用unlink(2))。 Unix文件語義將允許您繼續使用打開的文件,並且磁盤上的數據在您的句柄關閉之前不會真正刪除。然後沒有人能夠重命名文件。

+0

解除鏈接的問題是競爭條件。如果在取消鏈接或完成之前移動文件,則不需要骰子。 – Jaime 2012-01-16 19:50:03

+0

然後在打開它之前先移動文件。沒有人會知道這個新名字,然後你可以在最後打開並取消鏈接。如果這仍然不能解決您的問題,那麼您將不得不更詳細地描述您實際嘗試完成的任務。 – 2012-01-16 19:52:52

0

嘗試到access(2)關閉它之前的文件。如果您獲得ENOENT,則文件已被移動。按照/ proc/self/fd/$ open_file_number /符號鏈接找到使用readlink(2)的新文件名。

+0

好像這裏也有種族。如果訪問表明它沒有被移動,我嘗試刪除它,但是在這些調用之間移動,我運氣不好 – Jaime 2012-01-16 19:51:55

+0

只是再次做它:-) – ggiroux 2012-01-16 19:55:30

+0

使用'access'不會處理的情況下該名稱現在指向一個不同的文件。 – 2012-01-17 19:31:00

0

fstat打開文件,stat的名稱,並比較結果。

但是,與任何可能的檢查一樣,它仍然是活潑的;在您做出任何檢查之後但在您採取行動之前,名稱可能會改變含義。時間來重新審視你的要求。

相關問題