[英]Bash pipe execution order
如果我在 Terminal1 上打開一個 nc 監聽
nc -l 35555
並以這種方式在Terminal2上進行連接
mkfifo /tmp/f
cat /tmp/f | nc 127.0.0.1 35555 > /tmp/f
現在我有幾個問題
在 Terminal2 上,您可以看到正在等待的東西。 那是什么?
如果我在 Terminal1 上寫一個字符串,那個字符串就會回來。
cat /tmp/f | nc 127.0.0.1 35555 > /tmp/f
cat /tmp/f | nc 127.0.0.1 35555 > /tmp/f
不創建循環?接收到的字符串從 nc 出來並進入 /tmp/f。 由於 cat 字符串開始輸入 nc,發送回 Terminal1 並再次在 /tmp/f 等中。
謝謝。
- 是cat進程還是nc進程?
兩者都是。 cat
正在等待將某些內容寫入 FIFO。 nc
正在等待將某些內容寫入其stdin
或通過網絡套接字接收某些內容。
- 它們按什么順序執行?
管道中的所有命令同時運行。
- 為什么
cat /tmp/f | nc 127.0.0.1 35555 > /tmp/f
cat /tmp/f | nc 127.0.0.1 35555 > /tmp/f
不創建循環?
第一個終端沒有發回它從網絡接收到的內容,它只是將它打印到終端。 當您在終端 1 上鍵入內容時,它會被寫入網絡一次。 終端 2 上的nc
將其寫入/tmp/f
。 然后它讀取它並將其發送到網絡。 終端 1 上的nc
讀取並打印它。 這就是結束。
- 為什么fifo的貓不是阻塞操作? 從技術上講它並沒有結束,那么為什么要執行 nc 呢?
管道中的命令不會等待前一個命令退出。 這將使得不可能編寫像這樣的代碼
tail -f filename | grep word
因為tail -f
永遠不會退出(直到你用Ctl-c殺死它,但這也會殺死grep
)。 所有進程都運行,這使得后面的程序可以處理早期程序的部分output。
所以nc
不等待cat
退出。 它同時運行,並且可能使用select()
或epoll()
來同時監聽來自stdin
和網絡套接字的輸入(它也可能為每個使用單獨的線程)。 所以當cat
在 FIFO 上阻塞時,它可以從終端 1 讀取網絡數據,然后將其寫入 FIFO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.