【linux】mkfifo 命令创建命名管道实现进程之间通信

mkfifo 命令使用命名管道

下面均是再OSX系统实验。

创建管道liuzhizhi@lzz-rmbp|pipe # mkfifo log.pipe查看管道liuzhizhi@lzz-rmbp|pipe # ls -ltotal 0prw-r–r– :21 log.pipe

仔细看下最前面的部分 开头是 p,表示这是一个管道

使用管道一对一的情况 total 0prw-r–r– :25 log.pipe

这里管道并不是水桶,当我们执行 ls -l > log.pipe 的时候,这里就开始阻塞了,只有当我们再第二个窗口执行 cat < log.pipe 的时候,第一个窗口的ls命令才执行完。

所以这里的管道非常形象,它只是负责传输,虽然它也能存点水,但只有实用的时候才能存住一点水,如果只有一端倒水或者只有一端接水,都是无法正常运行的。

一个输入,多个接收的情况#窗口1 cat < log.pipe#窗口2 cat < log.pipe#窗口3echo “lzz” > log.pipe

执行的结果是窗口2输出了 lzz,第一个窗没有输出,说明接收方无论多个只能获取一份水,只要被一个接收方接受到,另外一个就无法获取了(所以他不是订阅型的),通过持续往管道输入可以看到,接收方应该是基于抢占式的。

多个输入,一个接受的情况

这里写了一个python程序来做为持续的输入

#coding:utf-8#logpipe.pyimport timeimport sysword = sys.argv[1]while 1:print >> sys.stdout, wordtime.sleep(1)

测试

#窗口1 cat < log.pipe#窗口2 python logpipe.py win1 > log.pipe#窗口3 python logpipe.py win2 > log.pipe#输出win2win2win2win2win1win1

其实这种情况,比较好理解,有个下水道大家都往里面倒水,最后汇总到一个口流出来,由于有缓冲区,所以并不会马上读取到结果。

小结

当然我们这里是用bash 操作这个命名管道,其实基本所有的语言都可以使用这个工具,例如bash命令写入管道,python读取,lua读取。

为什么想到这个东西呢,例如实时读取和处理tcpdump抓包,用c来开发成本有点大,,用其他语言当然也可以,但是硬件条件有不允许,所以只好通过管道的方式输出到一个非常廉价的小程序来处理喽。

遇见你,是我一生的幸运;爱上你,

【linux】mkfifo 命令创建命名管道实现进程之间通信

相关文章:

你感兴趣的文章:

标签云: