Pipe
Linux核心中的FIFO、管道和Unix域套接字是一樣的嗎?
我聽說 FIFO 是命名管道。它們具有完全相同的語義。另一方面,我認為 Unix 域套接字與管道非常相似(儘管我從未使用過它)。所以我想知道它們是否都指Linux核心中的相同實現。任何的想法?
UNIX 域套接字和 FIFO 可能共享其實現的某些部分,但它們在概念上非常不同。FIFO 的功能非常低。一個程序將字節寫入管道,另一個程序從中讀取。UNIX 域套接字具有與 TCP/IP 或 UDP/IP 套接字類似的行為。
套接字是雙向的,可以同時被許多程序使用。一個程序可以在同一個套接字上接受多個連接並同時處理多個客戶端。核心每次傳遞一個新的文件描述符
connect(2)
或accept(2)
在套接字上呼叫。數據包將始終進入正確的程序。在 FIFO 上,這是不可能的。對於雙向通信,您需要兩個 FIFO,並且每個客戶端都需要一對 FIFO。沒有辦法以選擇性的方式書寫或閱讀,因為它們是一種更原始的交流方式。
匿名管道和 FIFO 非常相似。不同之處在於匿名管道不作為文件系統上的文件存在,因此沒有程序可以
open(2)
。它們被通過另一種方法共享它們的程序使用。如果一個程序創建管道然後執行,例如 afork(2)
,它的子程序將繼承它的文件描述符,其中包括管道。(命名管道/FIFO的文件描述符也可以以相同的方式傳遞。)UNIX 域套接字、匿名管道和 FIFO 的相似之處在於它們使用文件描述符提供程序間通信,其中核心處理系統呼叫並抽像機制。