與未命名管道相比,使用命名管道有什麼優勢?
我正在查看一組來自 Unix 管理員的面試問題;我發現了一個名為“命名管道”的主題。
我用Google搜尋了這個話題;在某種程度上我已經能夠理解它:-命名管道 || 先進先出
但我仍然覺得我缺乏關於何時使用這種特殊類型管道的知識。是否存在未命名管道無法工作的特殊情況?
命名管道(fifo)有四個我能想到的三個優點:
- 您不必同時開始讀/寫過程
- 您可以擁有多個不需要共同祖先的讀者/作家
- 作為文件,您可以控制所有權和權限
- 它們是雙向的,未命名的管道可能是單向的 *
*) 考慮一個標準
|
的單向 shell 管道,幾個 shell(ksh
、zsh
和bash
)也提供允許雙向通信的協同程序。POSIX 將管道視為半雙工(即每一端只能讀取或寫入),pipe()
系統呼叫返回兩個文件句柄,您可能需要將一個視為只讀,另一個視為只寫。一些(BSD)系統支持同時讀取和寫入(POSIX 不禁止),在其他系統上,您需要兩個管道,一個用於每個方向。檢查您的pipe()
,popen()
可能還有popen2()
手冊頁。單向性可能不依賴於管道是否命名,儘管在 Linux 2.6 上它是依賴的。(更新,感謝Stephane Chazelas的回饋)
因此,使用未命名管道無法完成的一項顯而易見的任務是傳統的客戶端/伺服器應用程序。
上面關於單向管道的最後一點(受打擊的)在 Linux 上是相關的,POSIX(參見 參考資料
popen()
)說管道只需要可讀或可寫,在Linux 上它們是單向的。有關 Linux 特定的詳細資訊 (p787),請參閱了解 Linux 核心(第 3 版 O’Reilly)。其他作業系統提供雙向(未命名)管道。例如,Nagios 使用 fifo 作為其命令文件。各種外部程序(CGI 腳本、外部檢查、NRPE 等)向此 fifo 寫入命令/更新,這些由持久的 Nagios 程序處理。
命名管道的特性與 TCP 連接沒有什麼不同,但也有重要的區別。因為 fifo 有一個持久的文件系統名稱,即使沒有讀取器,您也可以寫入它,誠然,寫入將阻塞(沒有非同步或非阻塞 I/O),但如果接收器不是,您不會失去數據已啟動(或正在重新啟動)。
作為參考,另請參見Unix domain sockets ,以及總結主要IPC方法的Stackoverflow 問題的答案,以及討論
popen()