2010-11-06 29 views

回答

64

一個實際使用命名管道的最好的例子...

http://en.wikipedia.org/wiki/Netcat

另一個有用的特性是使用的netcat作爲代理。端口和主機都可以重定向。請看下面的例子:

nc -l 12345 | nc www.google.com 80 

端口12345表示請求 這將啓動在端口12345 NC服務器和所有連接重定向到google.com:80。如果網頁瀏覽器向nc發出請求,則該請求將發送至Google,但該響應不會發送至Web瀏覽器。這是因爲管道是單向的。這可以通過命名管道解決,以重定向輸入和輸出。

mkfifo backpipe 
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe 
+31

一個代理實現與殼單線程。沒有人告訴我,Unix可以做這個*。 – 2013-07-05 15:56:59

+3

呃...我想這實際上是一個雙線... – hft 2015-09-09 05:17:45

+3

@hft'mkfifo backpipe; nc -l 12345 0 backpipe'? – Levi 2015-12-21 11:10:35

18

下面是命令:

$ mkfifo named_pipe 

$ echo "Hi" > named_pipe & 

$ cat named_pipe 

第一個命令創建的管道。

第二個命令寫入管道(阻塞)。 &將其置於後臺,以便您可以繼續在同一個shell中輸入命令。當FIFO由下一個命令清空時它將退出。

最後一條命令從管道讀取。

+7

我會改變#爲$所以它不是所有的評論(並沒有作爲根運行!) – alternative 2010-11-06 16:45:00

+1

這只是爲了表明這是一個shell提示符! – Khaled 2010-11-06 16:49:03

+3

習慣使用「#」來表示根提示符(即,根shell中的提示符)。這裏沒有任何東西需要在root shell中運行。 – thomasrutter 2013-07-02 02:28:13

21

打開兩個不同的殼體,並將它們並排放置。在這兩個,去到/ tmp /目錄

cd /tmp/ 

在第一種類型:

mkfifo myPipe 
echo "IPC_example_between_two_shells">myPipe 

在第二個,類型:

while read line; do echo "What has been passed through the pipe is ${line}"; done<myPipe 

第一殼不會放棄你有任何提示,直到你在第二個shell中執行第二部分代碼。這是因爲FIFO的讀寫阻塞。

您也可以通過執行ls -al myPipe來查看FIFO類型,並查看該特定類型文件的詳細信息。

下一步是將腳本啓動到腳本中! - 希望能幫助到你。

+0

是否可以對fifo進行非阻塞寫入? – dabicho 2016-03-17 17:09:38