2009-06-24 233 views
8

我正在嘗試寫入NFS文件,找到NFS掛載並且它會阻止。可能是什麼問題呢?無法寫入通過NFS m FIFO的FIFO文件

我的/ etc /出口:

/tmp/test/ 10.0.0.0/24(rw,no_root_squash,async) 

LS/tmp/test目錄NFS服務器和客戶端上的是一樣的

prw--w--w- 1 root root 0 2009-06-24 17:28 ui-input 

,我正在寫爲根

感謝。

回答

5

這是一個名爲fifo,但我想它只適用於掛載文件系統的系統。 你有這個fifo的讀者嗎? 作家和讀者是否在同一個系統上?

fifo的工作原理如下:當進程打開fifo時,內核創建管道。 如果另一個進程打開fifo,那麼內核知道(從名稱)它是與先前打開的管道相同的管道。

這不能在兩臺不同的機器上工作。也就是說,如果進程A在client1上運行,進程B在client2上運行,那麼進程A和進程B不能通過fifo進行通信,因爲在每臺機器上都會創建一個fifo。

fifo在打開之前不存在,它只在本地退出,它對文件系統的內容沒有影響。

+0

是的我在另一端有讀者。我想我可以通過NFS訪問任何可以看到的文件。 – jackhab 2009-06-25 06:32:38

0

你有讀者在FIFO嗎? FIFOs將阻塞,直到另一端有讀數。 (在非阻塞模式下打開的通常例外情況適用。)

7

FIFO意味着是進程間通信機制。通過嘗試通過NFS導出FIFO,您要求內核將本地進程間通信視爲更多的網絡通信機制。

有很多問題與此有關,最明顯的是內核中的FIFO讀取實現需要用戶空間中的緩衝區來複制數據。這種緩衝區不能直接在NFS中使用。因此,內核不支持通過NFS導出FIFO。

您可能希望使用套接字代替網絡通信。

6

這個響應現在可能爲時已晚,但您可以使用命名管道和「nc」(netcat)命令獲得類似效果。 Netcat可以接受來自標準輸入(或命名管道)的輸入,並通過套接字將其輸出到另一個主機上的另一個netcat實例,可選地連接到命名管道。

所以基本上,你的設置應該是這樣的:

Host1$ mkfifo Host1_named_pipe 
Host1$ nc -l 1234 > Host1_named_pipe 

Host2$ mkfifo Host2_named_pipe 
Host2$ nc Host1 1234 < Host2_named_pipe 

現在,當你運行在主機2的程序和它的輸出發送到Host2_named_pipe,該輸出將在主機1來Host1_named_pipe出來。

或通過ssh:

Host1$ mknode Host1_named_pipe p 
Host2$ mknode Host2_named_pipe p 

Host1$ cat Host1_named_pipe | ssh Host2 'cat - > Host2_named_pipe' 
0

NFS被設計成一個多操作系統,最小公分母文件系統。因此,不是支持完整的Unix文件系統語義。特別是,如果可用,FIFO /命名管道將不會跨系統共享。 (同一主機上的兩個進程可能能夠通過NFS FIFO進行通信,但我不建議這樣做)。

如果你想要完整的Unix語義,你必須使用類似RFS的東西。請注意,與NFS的可移植性和95%解決方案相比,RFS的複雜性和降低的性能已使其基本過時。針對跨主機進程間通信的推薦解決方案是使用BSD樣式套接字或AT樣式流,具體取決於您的操作系統環境。對於Linux,請使用套接字。