【linux】mkfifo 命令创建命名管道实现进程之间通信
mkfifo 命令
- mkfifo命令创建一个FIFO特殊文件,是一个命名管道(可以用来做进程之间通信的桥梁)
- 管道也是一种文件,一般是linux中的一个页大小,4k,管道数据一旦被读取就没了。(管道大小和管道的buff大小理解有错误,请看 pipe-buffer-size-is-4k-or-64k? )
- 管道是单方向
- mkfifo命令文档
使用命名管道
下面均是再OSX系统实验。
创建管道
liuzhizhi@lzz-rmbp|pipe # mkfifo log.pipe
查看管道
liuzhizhi@lzz-rmbp|pipe # ls -l
total 0
prw-r--r-- 1 liuzhizhi staff 0 10 14 22:21 log.pipe
仔细看下最前面的部分 开头是 p,表示这是一个管道
使用管道
- 一对一的情况
#第一个窗口
# ls -l > log.pipe
#第二个窗口
# cat < log.pipe
total 0
prw-r--r-- 1 liuzhizhi staff 0 10 14 22:25 log.pipe
这里管道并不是水桶,当我们执行 ls -l > log.pipe 的时候,这里就开始阻塞了,只有当我们再第二个窗口执行 cat < log.pipe 的时候,第一个窗口的ls命令才执行完。
所以这里的管道非常形象,它只是负责传输,虽然它也能存点水,但只有实用的时候才能存住一点水,如果只有一端倒水或者只有一端接水,都是无法正常运行的。
- 一个输入,多个接收的情况
#窗口1
cat < log.pipe
#窗口2
cat < log.pipe
#窗口3
echo "lzz" > log.pipe
执行的结果是窗口2输出了 lzz,第一个窗没有输出,说明接收方无论多个只能获取一份水,只要被一个接收方接受到,另外一个就无法获取了(所以他不是订阅型的),通过持续往管道输入可以看到,接收方应该是基于抢占式的。
- 多个输入,一个接受的情况
这里写了一个python程序来做为持续的输入
#coding:utf-8
#logpipe.py
import time
import sys
word = sys.argv[1]
while 1:
print >> sys.stdout, word
time.sleep(1)
测试
#窗口1
cat < log.pipe
#窗口2
python logpipe.py win1 > log.pipe
#窗口3
python logpipe.py win2 > log.pipe
#输出
win2
win2
win2
win2
win1
win1
其实这种情况,比较好理解,有个下水道大家都往里面倒水,最后汇总到一个口流出来,由于有缓冲区,所以并不会马上读取到结果。
小结
当然我们这里是用bash 操作这个命名管道,其实基本所有的语言都可以使用这个工具,例如bash命令写入管道,python读取,lua读取。
为什么想到这个东西呢,例如实时读取和处理tcpdump抓包,用c来开发成本有点大,用其他语言当然也可以,但是硬件条件有不允许,所以只好通过管道的方式输出到一个非常廉价的小程序来处理喽。
【linux】mkfifo 命令创建命名管道实现进程之间通信的更多相关文章
- linux mkfifo命令基本用法
首先了解linux命令执行顺序 通常情况下,终端只能执行一条命令,然后按下回车,那么执行多条命令呢 顺序执行多条命令,可以用分号; cmd1;cmd2;cmd3 条件执行多条命令,使用&&am ...
- Linux系统编程之命名管道与共享内存
在上一篇博客中,我们已经熟悉并使用了匿名管道,这篇博客我们将讲述进程间通信另外两种常见方式--命名管道与共享内存. 1.命名管道 管道是使用文件的方式,进行进程之间的通信.因此对于管道的操作,实际上还 ...
- 邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#
邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系 ...
- C#中使用命名管道进行进程通信的实例
原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用 ...
- UWP使用命名管道与桌面程序通信 (C#)
关于UWP的历史,其起源是Microsoft在Windows 8中引入的Metro apps.(后来又被称作Modern apps, Windows apps, Universal Windows A ...
- 管道(pipe),进程之间的共享内存(Manager,Value)
1 管道(了解) from multiprocessing import Pipe con1,con2 = Pipe() 管道是不安全的. 管道是用于多进程之间通信的一种方式. 如果在单进程中使用管道 ...
- IPC进程之间通信的几种方式
概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是 ...
- Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型
Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: 每个对象都对应于一个可称为" 互斥锁&qu ...
- 进程与进程之间通信Manager
#!/usr/bin/env python from multiprocessing import Process,Manager #Manager进程与进程之间通信 def Foo(i,dic): ...
随机推荐
- springMVC源码解析--ViewResolverComposite视图解析器集合(二)
上一篇博客springMVC源码分析--ViewResolver视图解析器(一)中我们介绍了一些springMVC提供的很多视图解析器ViewResolver,在开发的一套springMVC系统中是可 ...
- linux系统性能监控--I/O利用率
尽管整体的处理器速度. 内存大小以及 I/O执行速度在不断提高,但 I/O操作的吞吐率和延迟性能仍然要比等价的内存访问操作低多个数量级.另外,由于许多工作负荷都拥有重要的I/O组件,I/O处理很容易成 ...
- audio session config
#pragma mark - #pragma mark - audio session config - (void)setAudioSessionConfig { NSError *error; A ...
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
上一篇我们介绍了缩短五倍的java bean,不知道你在看的时候有没有一种疑问捏? 本文同步自博主的私人博客wing的地方酒馆 再来回顾一下,两种代码的对比 public class User { p ...
- android 自定义view之选座功能
效果图: 界面比较粗糙,主要看原理. 这个界面主要包括以下几部分 1.座位 2.左边的排数 3.左上方的缩略图 4.缩略图中的红色区域 5.手指移动时跟随移动 6.两个手指缩放时跟随缩放 主要技术点 ...
- Scala: 简介和安装
http://blog.csdn.net/pipisorry/article/details/52902117 Note: lz只是稍微学学,能看懂就行,不深入.适合scala小白. Scala简介 ...
- 2017腾讯校招面试回忆(成功拿到offer)
我本来报的岗位是企业事业群,后来把我分配到了技术工程群 希望对明年找工作的朋友们能有一点帮助 一面 21号 大概1小时 面试半小时 聊天半小时 1 二叉树的查找 我大笔一挥,在纸上写下了下面的的代码 ...
- sybase isql命令参数详解
isql 实用工具使您得以输入 Transact-SQL 语句.系统过程和脚本文件. 语法 isql [-?] | [-L] | [ { {-U login_id [-P password]} | - ...
- EBS开发常用编译命令
一.编译FORM 1.将脚本写成shell脚本 cd $AU_TOP/forms/ZHS export FORMS_PATH=.:$FORMS_PATH:$AU_TOP/forms/ZHS frmcm ...
- Oracle 大数据集成实施
Oracle 大数据实施架构 Oracle为广大客户提供了一个预装的用于测试和学习目的的免费大数据环境.你可以在这个环境中对Oracle大数据一体机(Big Data Appliance)上的可选软件 ...