簡體   English   中英

在 ZEDC9F0A5A5D57797BF68E37367 中使用 UNIX 命名管道而不是 TCP sockets 的好處?

[英]Benefits on using UNIX named pipes instead of TCP sockets, in Linux?

我到處讀到有關命名管道與 sockets 的信息,我看到一個套接字可以做命名 pipe 可以做的事情,等等。 我猜管道可能會更快,因為它們更簡單,但我沒有在任何地方明確找到它。

在 Linux 中,使用命名管道代替 sockets 有什么優勢嗎?

感謝您的幫助和時間。


編輯:我在 這里找到了一些比較,但這些是 UNIX 套接字(又名 UNIX 域套接字), 基於此,我知道它們是不同的生物。

Therefore, I clarify: I am asking about TCP sockets versus Unix named pipes (because MS Windows has another thing called "named pipes", but they seem to be functionally more similar to UNIX domain sockets).

在這一點上,在我看來 UNIX 命名管道比 TCP sockets 更快,但我想知道一些技術細節,說明為什么會出現這種情況,以及其他潛在好處。

這可能是一個不完美的答案,但這就是我所知道的。

通過 TCP 套接字發送數據意味着傳輸需要通過您的網絡系統,將獲得源和目標 IP,最多拆分為 64K 數據包。 包裝在 TCP 和 IP 信封中,可能通過防火牆規則 go。 收件人還需要確認包裹,確保它們按順序到達,並且需要進行協商,以防包裹丟失並需要重新發送。

在命名為 pipe 中發送數據或多或少就像寫入文件描述符(如 STDOUT)並從 STDIN 讀取。

通過網絡堆棧(即使它只是本地主機)只是有更多的層次和復雜性。 能夠可靠地將消息發送到世界另一端的系統需要這樣,但名為 pipe 的簡單本地不需要。

我到處讀到有關命名管道與 sockets 的信息,我看到一個套接字可以做命名 pipe 可以做的事情,等等。

命名管道像文件一樣使用。

如果您想做一些對文件有效但不適用於套接字的事情,這是一個很大的好處。

例子:

ls > /dev/lp1
ls > ./myNamedPipe
# Not possible: ls > 127.0.0.1:9323

dd if=myFile bs=1 count=100 of=/dev/lp1
dd if=myFile bs=1 count=100 of=./myNamedPipe
# Not possible: dd if=myFile bs=1 count=100 of=127.0.0.1:9323

MS Windows 還有一個叫做“命名管道”的東西,但它們在功能上似乎更類似於 UNIX 域 sockets

事實是 MS Windows 具有用於訪問命名管道的附加 API 函數。 但是,標准 Windows 文件 API(由 C 函數使用,如open()read()write() )也適用於命名管道。

出於這個原因,您還可以使用名為 pipe 作為 Windows 中的文件。 我已經這樣做來模擬連接了某個設備的串行端口。

...和其他潛在的好處。

一個明顯的好處(命名管道和 Unix 套接字)是命名本身:

如果某個程序foobarSimpleProgram想要與另一個名為foobarOtherProgram的程序通信,它可以簡單地創建一個 Unix 套接字或一個名為 pipe 的名為/tmp/foobarProgramSuite的程序。

任何其他程序都不太可能使用此名稱。

在 TCP 套接字監聽localhost的情況下,程序必須使用固定的 TCP 端口; 在這種情況下,存在另一個程序使用相同的 TCP 端口的風險,因此只能使用兩個程序中的一個。

或者程序綁定到 TCP 端口 0,因此操作系統分配了一些空閑的 TCP 端口。 然后程序將端口號寫入文件/tmp/foobarProgramSuite由另一個程序讀取,然后執行connect()

這比使用給定名稱直接連接到 pipe 或套接字更復雜。

暫無
暫無

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

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