FIFO管道

写脚本的时候用到FIFO,不是很会,就学习了下。下面是简介:

FIFO也称为有名管道,它是一种文件类型。FIFO简单理解,就是它能把两个不相关的进程联系起来,FIFO就像一个公共通道,解决了不同进程之间的“代沟”。普通的无名管道只能让相关的进程进行沟通(比如父shell和子shell之间)。还是用代码来说明问题好了。

下面我模拟了一个FIFO通信的过程,主要有两个进程。

#!/bin/bash
#Client.sh
#不断向fifo写入数据

tmp_fifo="/tmp/test.fifo"
rm -f $tmp_fifo
mkfifo $tmp_fifo
exec 6<>$tmp_fifo #这句话能把管道变成非阻塞!

i=0
while :
do
	sleep 1                 # 1秒写一次
	echo "$i" >&6
        echo "$i"    #输出到终端的时候要小心,会覆盖你的终端,所以要停止,最好直接挂起进程!!
	let i++
done 

exec 6>&-

#!/bin/bash
#Server.sh
#不断从fifo中读出数据

tmp_fifo="/tmp/test.fifo"
echo "$tmp_fifo"
exec 6<>$tmp_fifo                 #建立一个绑定

while :
do
        read TEXT
	sleep 1
	echo "$TEXT"          #每1s就读取一个数据,并且打印到终端,要停止,最好挂起进程!
done <&6

打开终端A:
$ ./Client.sh


打开终端B:
$./Server.sh


你就能看到在终端B中从fifo中读取到的数据,你要是在终端B中把每次读fifo的间隔给改成2秒,就更能说明问题了。上面的程序,在实验的时候最好通过不断挂起A进程来查看,然后观察B进程的输出。你会知道FIFO整个是怎么跑的。。。这里就不详细解释了!

FIFO的出现,极好地解决了系统在应用过程中产生的大量的中间临时文件的问题。FIFO可以被shell调用使数据从一个进程到另一个进程,系统不必为该中间通道去烦恼清理不必要的垃圾,或者去释放该通道的资源,它可以被留做后来的进程使用。并且规避了匿名管道在作用域的限制,可应用于不相关的进程之间。

标签:Linux, Shell

评论已关闭