"FIFO"是一种特殊的文件类型,它允许独立的进程通讯. 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作, 然后数据便可以如同在shell或者其它地方常见的的匿名管道一样流线执行.
OPTIONS(选项)
-m mode, --mode=mode
设置创建的FIFO的模式为 mode, 这可以是 chmod(1) 中的符号模式,并使用默认模式作为起始点.
--help
在标准输出上打印一条用法信息,并以成功状态退出.
--version
在标准输出上打印版本信息,然后以成功状态退出.
--
终止选项列表.
阿
下面通过例子来说明该命令的用法:
[root@server7 ~]# mkfifo fifo //创建一个fifo
[root@server7 ~]# echo example >example.txt
[root@server7 ~]# cat example.txt
example
[root@server7 ~]# cat example.txt > fifo //放在后台方便
^C
[root@server7 ~]# cat example.txt > fifo &
[1] 2002
[root@server7 ~]# cat < fifo //fifo 导入 cat
example //成功输出了example.txt里的数据
[1]+ Done cat example.txt > fifo
[root@server7 ~]# cat < fifo
个人理解:fifo就相当于管道,他只是负载数据导向传送,并不负责存储数据, 因此我们第一次 cat < fifo 显示了数据,第二次就没了,就像水流了不会呆在源地 。
[root@server7 ~]# ll fifo
prw-r--r-- 1 root root 0 Aug 8 12:56 fifo
大小为0,足以为证
接下来是一个shell程序,利用fifo实现了主对从的任务分发
1.主
#########################################################################
2 # File Name: master.sh
3 # Author: dty
4 # mail: 576786031@qq.com
5 # Created Time: Fri 07 Aug 2015 09:04:53 PM CST
6 #########################################################################
7 #!/bin/bash
8 pid=$$ //得到当前脚本的pid
9 fifo=/tmp/fifo.$pid //设定pid独一无二的fifo名字,以及路径
10 log=/tmp/log.$pid //记录操作
11 > $log //清空文件,保证纯净
12 echo "my PID is $pid" //输出pid,便于下面从使用
13 mkfifo $fifo //建立fifo了!
14 while :
15 do
16 echo -en "Give me a command for one of my minions:"
17 read cmd
18 echo $cmd > $fifo //把你输入的东西导入到fifo
19 done
20 rm -fr $log $fifo //循环结束删除fifo和记录
#########################################################################
2.从
2 # File Name: minion.sh
3 # Author: dty
4 # mail: 576786031@qq.com
5 # Created Time: Sat 08 Aug 2015 12:06:30 PM CST
6 #########################################################################
7 #!/bin/bash
8 master=$1 //$1需要我们手动输入主脚本里设定的显示出来的pid
9 fifo=/tmp/fifo.$master //即主的fifo
10 log=/tmp/log.$master //即主的记录
11
12 while :
13 do
14 read cmd args < $fifo //把主的fifo导入read ,此时 变量 cmd args 就是master上你输入的东西
15 if [ ! -z "$cmd" ];then //
16 if [ "$cmd" == "quit" ];then //如果你输入quit了
17 echo "very good,master."|tee -a $log //就退出,同时往记录里追加very good,master,表示一个从脚本已经退出
18 exit 0 //退出
19 fi
20 echo "`date`:Executing \"${cmd}\" for the master." |tee -a $log //显示你输入的命令
21 if [ ! -z "$args" ];then //如果你的命令有第二个参数以上
22 for arg in $args
23 do
24 echo -en "$args" |tee -a $log //把第二个参数输出出来,然后追加到记录
25 sleep 1
26 done
27 echo | tee -a $log //输出个空行到记录,容易辨认
28 fi
29 fi
30 sleep 10
31 done
~
运行脚本 从输入主 的pid建立连接,输入命令,右上角主,右下角记录,左边是从脚本。
如下
可见,fifo 主的相当于管道的一端,从是另一端,从而保证了数据在不同脚本之间传输~~