2009-07-06 63 views
7

如何判斷文件是否在C中打開?我認爲更多的技術問題是如何檢索對現有文件的引用數量,並確定該信息是否可以安全地打開。如何判斷一個文件是否在C上的其他地方打開?

我正在實施的想法是一個文件隊列。你轉儲一些文件,我的代碼處理這些文件。我不想在生產者關閉文件描述符之前開始處理。

一切都在linux中完成。

感謝, Chenz

回答

5

挖掘出這些信息被大量的工作(你必須尋找thorugh的/ proc/*/FD 你會更好與任何的:

  • 保存到臨時然後重命名。無論您的文件寫入到一個臨時文件名或目錄,當你完成writinh,將其重命名爲您的應用程序讀取它們的目錄。重命名是原子,因此當文件存在你知道它是安全的讀取。
  • 也許以上的變體,當你完成了文件foo的創建後,你將創建一個名爲的空文件foo.finished。處理文件時,您會查找* .finished的存在。
  • 在寫入的同時鎖定文件,讀取文件的方式將會阻止,直到作者解鎖爲止。看到flock/lockf功能,他們是諮詢鎖,儘管讀者和作者都必須鎖定並兌現鎖。
+0

我得出的結論是,第二個建議是對我的情況最好的。謝謝! – 2009-07-06 14:24:48

3

我不認爲有什麼辦法用純C要做到這一點(它不會是跨平臺)。

如果你知道你正在使用的時間提前了哪些文件,可以使用inotify當他們打開通知。

+1

是的,他也可以使用inotify來檢測文件是否已關閉。 – zvrba 2009-07-06 14:25:13

0

C有一個文件處理設施,但沒有太多用於獲取關於它們的信息。在便攜式C中,你可以做的唯一的事情就是試圖以所需的方式打開文件,看看它是否有效。

0

由於variuos的原因,您通常不能那麼做(例如,您不能說該文件是否與另一個用戶打開)。

如果你可以控制打開文件的過程和您嘗試通過鎖定文件,以避免衝突(也有爲了在Linux上許多圖書館做)

0

使用lsof命令。 (列表打開的文件)。

0

如果你在控制生產者和消費者,你可以使用flock()的lockf()來鎖定文件。

0

存在於大多數發行版lsof的命令,這顯示當前打開的所有文件,你可以,如果你的文件在同一目錄中還是有一些識別的名稱模式ofcourse grep的輸出。

相關問題