2010-11-15 39 views
0

我很困惑linux可以讓應用程序從管道讀取,例如「cat/etc/hosts | grep'localhost'」。我知道在一個獨立的程序中分叉一個孩子,並通過管道相互溝通。但是對於兩個獨立的管道溝通方案,我不知道如何。 例如「cat/etc/hosts | grep'localhost'」Grep如何知道應該讀取哪個文件描述符才能從「cat/etc/hosts」中獲取輸入。有沒有一個由操作系統提供的「傳統」管道,讓Grep知道從哪裏得到輸入?我想知道這背後的機制。linux如何讓應用程序從管道讀取

回答

4

你的示例中的grep從標準輸入中獲取它。它是殼的責任叫pipe(2)創建管道,然後在每個fork(2)孩子dup2(2)分配他們的標準輸入或調用的exec(3)功能之一實際運行其他可執行文件之前,標準輸出管道的結束。

+0

這裏重要的一點是,在給出的例子中,'cat'和'grep'都是shell的子進程,所以它們*是*相關的。 – caf 2010-11-16 03:45:51

+0

它是'pipe(2)',而不是'mkfifo(3)',因爲管道是未命名的。 – 2010-11-18 23:53:30

+0

@羅曼:對,謝謝。 – 2010-11-18 23:54:48