管道和流到底有什麼差別?

管道和流到底有什麼差別?

我讀到了有關管道和流的內容,但我仍然對它的實現方式感到困惑。

程式啟動並從“標準輸入”流(stdin)讀取數據,這是鍵盤發送數據的地方。

我的問題是,它與管道有什麼不同?管道允許我有一個進程將資料發送到管道,另一個進程正在從中讀取資料。

當按下鍵盤時,資料被發送到標準輸入,並且程式正在從同一流中讀取資料。

一旦資料發送到該流,就會執行“讀取”操作,就像管道一樣。

這些流是透過管道傳輸的嗎?

答案1

Unix 終端 I/O 傳統上實現為某種佇列。較舊的核心使用 clist。使用V8 Unix溪流。在大多數情況下,clist 和流用於實現使用者進程(具體來說,檔案描述符)和字元裝置驅動程式(例如,序列埠或 pty)之間的部分連結。

管道也是一個佇列,但它們連結使用者進程(具體來說,是一對檔案描述符)。管道有多種實現,包括套接字;特殊類型的文件;甚至 STREAMS(STREAMS 是 V8 流的衍生版本。)

因此,流和管道都是隊列的實現,但它們的使用情況不同。

答案2

從技術角度來看,這可能並不完全準確,但可能會幫助您解決困惑。我傾向於將流視為程式固有的東西,例如 STDIN、STDOUT 和 STDERR,而管道是程式外部的。例如,在 command 中cat foo.txt | grep barcat命令會傳送到其固有的 STDOUT,然後外部管道將其連接到grep的固有 STDIN。

相關內容