簡體   English   中英

進程和共享文件描述符

[英]Processes and a shared file descriptor

我有一個創建自己的多個實例(進程)的應用程序,並且這些進程具有共享的數據結構。 在該結構中,有一個文件描述符,用於將數據記錄到文件中。 日志記錄功能中有一項檢查,檢查文件描述符是否為-1,如果為-1,則打開文件並設置共享文件描述符的值。

其他進程/線程執行相同的檢查,但是此時fd為!= -1。 因此,該文件不會打開。 然后,他們繼續寫入文件。 大部分時間寫入失敗,並返回-1。 當寫入沒有失敗時,我使用readlink檢查了fd的文件路徑。 路徑是日志文件以外的其他文件。

我假設這是因為即使文件描述符值始終為11,即使在隨后的運行中,該值也為每個進程引用了一個不同的文件。 那么這是進程打開的第十一個文件嗎? 因此,對於這些進程,日志文件甚至都不被認為是打開的,即使它們確實打開了文件,fd也會有所不同。

所以我的問題是正確的嗎? 我的第二個問題是,鑒於需要多個進程寫入此日志文件,我該如何重新實現此方法。 是每個進程都需要打開該文件..還是有另一種更有效的方法..我是否需要關閉文件,以便其他進程可以打開和寫入文件。

編輯:

該軟件是一個名為filebench的開源軟件。 該文件可以在這里看到。

日志方法是filebench_log。 204行是我提到的打開文件的第一個檢查。 寫操作發生在第293行。fd值在所有進程中均為11,並且該值相同:11.實際上,在所有進程和設置中它實際上都在此處共享。 該文件僅打開一次(通過打印語句驗證)。

具有fd的共享數據結構稱為

filebench_shm 

而FD是

filebench_shm->shm_log_fd 

編輯2:我得到的錯誤消息是錯誤的文件描述符。 Errno是9。

編輯3:因此,似乎每個進程都有fds不同的索引表。 維基:

On Linux, the set of file descriptors open in a process can be accessed under the path /proc/PID/fd/, where PID is the process identifier.

因此,我遇到的問題是,對於具有進程ID 101、102的兩個進程,文件描述符11對於兩個進程是不同的:

/proc/101/fd/11 
/proc/102/fd/11

我在這些進程之間有一個共享的數據結構..除了fd之外,還有其他方法可以在它們之間共享一個打開的文件嗎,因為那不起作用?

在生成新進程之前,打開文件似乎最簡單。 這樣就避免了通過將文件集中到一個時間和位置來打開文件的所有協調工作。

我最初將其寫為解決方案:

  • 創建一個共享內存段。
  • 將文件描述符變量放入段中。
  • 在該段中放置一個互斥量信號燈
  • 每個進程都訪問該段中的文件描述符。 如果未打開,請鎖定信號量,檢查它是否已打開,以及是否未打開文件。 釋放互斥鎖。

這樣,所有進程共享相同的文件描述符。

但這假設基礎文件描述符對象也位於共享內存中,我認為並非如此。

相反,請使用其他答案中提到的open then fork方法,或者讓每個進程打開文件並在需要時使用flock序列化訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM