當我們知道在Linux上使用inotify試圖監視一個目錄時,一旦創建文件就會收到通知(在另一個進程寫完之前到它)如何確保在完成寫入操作之前不讀取文件
有沒有一種有效的方法來確保文件在寫入之前沒有被讀取完成由其他進程?
我們可能會添加延遲讀取;但我們都知道,這是有缺陷的。
欲瞭解該場景的更多清晰度,這兩個進程以不同的用戶身份運行;預計的負載大約是每秒創建的幾百個文件。
當我們知道在Linux上使用inotify試圖監視一個目錄時,一旦創建文件就會收到通知(在另一個進程寫完之前到它)如何確保在完成寫入操作之前不讀取文件
有沒有一種有效的方法來確保文件在寫入之前沒有被讀取完成由其他進程?
我們可能會添加延遲讀取;但我們都知道,這是有缺陷的。
欲瞭解該場景的更多清晰度,這兩個進程以不同的用戶身份運行;預計的負載大約是每秒創建的幾百個文件。
根據你的問題,這聽起來像你目前正在監視IN_CREATE
(也許IN_OPEN
)標誌的目錄。爲什麼不使用IN_CLOSE
標誌,以便在文件關閉時收到通知?從那裏開始,應該很容易地跟蹤文件是否已經打開,並且你會知道你不想嘗試讀取它。
謝謝jamessan;您的回覆幫助我找到了一個似乎適用於我的解決方案。 我現在監視IN_CREATE和IN_CLOSE;將他們結合起來,將新到達的人員選入我正在監控的目錄中!謝謝您的幫助。 – 2010-07-18 22:24:06
您可以檢查/proc/<pid>/fd
以查看文件是否仍然打開。如果它沒有在那裏列出,你可以確定該過程不再使用它。
有沒有辦法找到由外部進程打開的文件的fd;沒有我聽說過的。 AFAIK,fd是特定於進程的,只有操作系統和進程纔會知道fd和磁盤上的文件之間的關係;如果有什麼辦法的話,我確信只有root才能使用。 – 2010-07-16 18:53:37
@CodeMedic看看目錄。 fd是文件本身的symbolik鏈接,所以你不需要轉換fd - > name,你所要做的就是使用'lstat'來查看鏈接指向哪個文件。 – Gianni 2010-07-16 18:56:14
例如:user @ box:〜#ls -l/proc/1433/fd/0 lr-x ------ 1 root root 64 2010-07-16 15:31/proc/1433/fd/0 - >/dev/null – Gianni 2010-07-16 18:57:20
創建它在其他地方,寫信給它,關閉它,然後重命名它 - 或者我錯過了明顯的東西?
是的,這是正確的方法。或者在臨時名稱下創建它,並在完成時重命名。 – MarkR 2010-07-17 12:43:50
只有當我對這個過程有控制權時纔會這樣!在這裏我不!它是第三方的作品。 – 2010-07-19 10:01:56
也許lsof命令可以提供幫助。它列出了所有打開的文件。 $ man lsof
這裏的問題不是關於從shell執行副本。 – 2010-07-27 00:03:22
我想你不能只爲每個文件創建一個已命名的信號量,以確保每次只有一個進程正在使用一個文件? – Gianni 2010-07-16 18:12:25
定義「完成」...除非過程關閉文件,否則即使原則上,是否可以確定某個過程是否「完成」寫入該過程? – Cogwheel 2010-07-16 18:12:31
您是否可以控制讀取/寫入文件的程序,還是需要使用「任何第三方程序」? – 2010-07-16 18:14:57