linux mkfifo 命令_linux-shellscript 之mkfifo使用

"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 

example           //成功输出了example.txt里的数据

[1]+  Done                    cat example.txt > fifo

[root@server7 ~]# cat 

个人理解: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 

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 主的相当于管道的一端,从是另一端,从而保证了数据在不同脚本之间传输~~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值