歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網

FIFO管道

日期:2017/3/1 10:07:46   编辑:Linux編程

寫腳本的時候用到FIFO,不是很會,就學習了下。下面是簡介:

FIFO也稱為有名管道,它是一種文件類型。FIFO簡單理解,就是它能把兩個不相關的進程聯系起來,FIFO就像一個公共通道,解決了不同進程之間的“代溝”。普通的無名管道只能讓相關的進程進行溝通(比如父shell和子shell之間)。還是用代碼來說明問題好了。

下面我模擬了一個FIFO通信的過程,主要有兩個進程。

  1. #!/bin/bash
  2. #Client.sh
  3. #不斷向fifo寫入數據
  4. tmp_fifo="/tmp/test.fifo"
  5. rm -f $tmp_fifo
  6. mkfifo $tmp_fifo
  7. exec 6<>$tmp_fifo #這句話能把管道變成非阻塞!
  8. i=0
  9. while :
  10. do
  11. sleep 1 # 1秒寫一次
  12. echo "$i" >&6
  13. echo "$i" #輸出到終端的時候要小心,會覆蓋你的終端,所以要停止,最好直接掛起進程!!
  14. let i++
  15. done
  16. exec 6>&-

  1. #!/bin/bash
  2. #Server.sh
  3. #不斷從fifo中讀出數據
  4. tmp_fifo="/tmp/test.fifo"
  5. echo "$tmp_fifo"
  6. exec 6<>$tmp_fifo #建立一個綁定
  7. while :
  8. do
  9. read TEXT
  10. sleep 1
  11. echo "$TEXT" #每1s就讀取一個數據,並且打印到終端,要停止,最好掛起進程!
  12. done <&6

打開終端A:

$ ./Client.sh

打開終端B:

$./Server.sh

你就能看到在終端B中從fifo中讀取到的數據,你要是在終端B中把每次讀fifo的間隔給改成2秒,就更能說明問題了。上面的程序,在實驗的時候最好通過不斷掛起A進程來查看,然後觀察B進程的輸出。你會知道FIFO整個是怎麼跑的。。。這裡就不詳細解釋了!(最近太累了~~~)

FIFO的出現,極好地解決了系統在應用過程中產生的大量的中間臨時文件的問題。FIFO可以被shell調用使數據從一個進程到另一個進程,系統不必為該中間通道去煩惱清理不必要的垃圾,或者去釋放該通道的資源,它可以被留做後來的進程使用。並且規避了匿名管道在作用域的限制,可應用於不相關的進程之間。

Copyright © Linux教程網 All Rights Reserved