Pipe

與未命名管道相比,使用命名管道有什麼優勢?

  • February 28, 2020

我正在查看一組來自 Unix 管理員的面試問題;我發現了一個名為“命名管道”的主題。

我用Google搜尋了這個話題;在某種程度上我已經能夠理解它:-命名管道 || 先進先出

但我仍然覺得我缺乏關於何時使用這種特殊類型管道的知識。是否存在未命名管道無法工作的特殊情況?

命名管道(fifo)有四個我能想到的三個優點:

  • 您不必同時開始讀/寫過程
  • 您可以擁有多個不需要共同祖先的讀者/作家
  • 作為文件,您可以控制所有權和權限
  • 它們是雙向的,未命名的管道可能是單向的 *

*) 考慮一個標準|的單向 shell 管道,幾個 shell(kshzshbash)也提供允許雙向通信的協同程序。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()

引用自:https://unix.stackexchange.com/questions/69057