簡體   English   中英

Bash pipe 執行順序

[英]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 上,您可以看到正在等待的東西。 那是什么?

  • 是cat進程還是nc進程?
  • 它們按什么順序執行?

如果我在 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 等中。

  • 為什么fifo的貓不是阻塞操作? 從技術上講它並沒有結束,那么為什么要執行 nc 呢?

謝謝。

  • 是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.

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