2011-04-22 40 views
10

如何檢查文件是否仍在寫入?我需要等待一個文件被創建,寫入並被另一個進程關閉,所以我可以繼續在我的進程中再次打開它。如何檢查文件是否仍在寫入?

+1

你能解釋一下你的用例嗎?也許使用管道(簡單管道或命名管道)而不是單個文件對你來說更容易。 – evnu 2011-04-22 18:36:06

+0

如果有幫助,儘管... write/writev是原子的。因此,只要您要保證的是您的寫入不會與其他寫入混在一起,那麼您所要做的就是確保您寫入的所有內容都適合寫入writev()的單個調用。然後,文件是否打開並不重要,操作系統會以某種方式對其進行排序。 – Damon 2011-04-22 22:36:08

+0

可能的重複[如何確保在寫入之前不讀取文件](http://stackoverflow.com/questions/3267685/how-to-make-sure-not-to-read-a-文件之前完成寫入它) – Beginner 2015-02-17 17:04:28

回答

5

一般來說,這是一個難以解決的問題。在某些情況下,您可以詢問文件是否爲開放;但是,如果其他進程是腳本,則可能會多次打開並關閉該文件。我強烈建議您使用諮詢鎖或其他明確的方法讓其他進程在完成文件時進行通信。

這就是說,如果這不是一個選項,那麼還有另一種方法。如果您查看/proc/<pid>/fd目錄,其中<pid>是某個正在運行的進程的數字進程ID,那麼您會看到一些符合連接的進程打開的文件。符號鏈接上的權限反映文件打開的模式 - 寫入權限意味着它被打開爲寫入模式。

因此,如果您想知道某個文件是否處於打開狀態,只需掃描每個進程的/proc條目以及其中的每個文件描述符,即可查找到文件的可寫符號鏈接。如果你知道另一個進程的PID,你也可以直接看看它的proc入口。

這當然有一些主要缺點。首先,除非你是root用戶,否則你只能看到自己進程的打開文件。它也相對較慢,只適用於Linux。再次,如果其他進程打開和關閉文件多次,您就會陷入困境 - 您可能最終在關閉期間看到它,並且沒有簡單的方法知道它是否會再次打開它。

+3

如果某個遠程進程通過NFS寫入文件,您將不會看到它。 (除非有實際寫作的本地進程,但我認爲它是在內核中完成的。) – 2011-08-15 22:39:32

3

寫完讀寫過程感興趣的數據文件後,您可以讓寫入過程寫一個哨兵文件(比如說「sentinel.ok」)。在讀過程中,您可以檢查哨兵的存在在讀取數據文件之前,確保數據文件完全寫入。

1

@ blu3bird使用哨兵文件的想法並不差,但它需要修改寫入文件的程序。

這裏還有一個可能性,還需要修改的作家,但它可能是更穩健:

寫入到一個臨時文件,說「foo.dat.part」。當寫入完成時,將「foo.dat.part」重命名爲「foo.dat」。這樣,讀者根本不會看到「foo.dat」,或者會看到它的完整版本。

0

您可以嘗試使用inotify

http://en.wikipedia.org/wiki/Inotify

如果知道該文件將被打開一次,寫,然後關閉,將有可能爲您的應用程序等待IN_CLOSE_WRITE事件。

但是,如果其他應用程序執行文件寫入的行爲更像打開,寫入,關閉,打開,寫入,關閉....那麼您需要一些其他機制來確定何時其他應用程序已經真正完成了文件。

相關問題