FIFO管道


写脚本的时候用到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调用使数据从一个进程到另一个进程,系统不必为该中间通道去烦恼清理不必要的垃圾,或者去释放该通道的资源,它可以被留做后来的进程使用。并且规避了匿名管道在作用域的限制,可应用于不相关的进程之间。

相关内容