Python中使用PIPE操作Linux管道


Posted in Python onFebruary 04, 2015

Linux中进程的通信方式有信号,管道,共享内存,消息队列socket等。其中管道是*nix系统进程间通信的最古老形式,所有*nix都提供这种通信方式。管道是一种半双工的通信机制,也就是说,它只能一端用来读,另外一端用来写;另外,管道只能用来在具有公共祖先的两个进程之间通信。管道通信遵循先进先出的原理,并且数据只能被读取一次,当此段数据被读取后,马上会从数据中消失,这一点很重要。

Linux上,创建管道使用pipe函数,当它执行后,会产生两个文件描述符,分别为读端和写端。单个进程中的管道几乎没有任何作用,通常会先调用pipe,然后调用fork,从而创建从父进程到子进程的IPC通道。

Python中使用PIPE操作Linux管道

Linux中,我们经常会使用到管道,例如用cat命令查看一个大文件时,一页不能全部显示,我们可以通过cat xxx | more来分页显示,又比如搜索文件里的内容可以用 cat xxx | grep search来进行,这里我们都用到了管道。接下来我会用python编写一段自动分页显示的程序,而不用手动来使用管道。

#!/usr/bin/env python
import os,sys
if not sys.argv[1:]:
  print "No filename input"
  sys.exit(1)
try:
    fp = open(sys.argv[1],"r")
except IOError,msg:
  sys.exit(msg)
pi=os.pipe()
pid=os.fork()
if pid:
  #parent
  os.close(pi[0]) #close read pipe
  #write to pipe
  line=fp.readline()
  while line:
    os.write(pi[1],line)
    line=fp.readline()
  #close write pipe
  os.close(pi[1])
  #wait for chile
  os.waitpid(pid,0)
else:
  os.close(pi[1]) #close write pipe
  #put pipe read to stdin
  os.dup2(pi[0],sys.stdin.fileno())
  os.close(pi[0])
  os.execl("/bin/more","more")

把这段代码存为scat.py,增加执行权限之后,运行 scat.py 文件名,系统就会自动读取文件的内容并分页,与使用 cat 文件名 | more 的效果是一模一样的。在上面的代码中,用到了前几篇博客中说的fork,dup2和exec系列函数。

首先是程序创建了一个管道,系统fork之后,父进程关闭其读端,子进程关闭其写端,接下来父进程读取传递过来的文件名,并把内容通过管道的写入端口写入管道里,然后关闭写入端口,并等待子进程的结束。子进程在关闭写入端口后,把读取端口重定向到进程的标准输入,子进程就能自动接收到管道传递过来的数据,最后用execl函数调用系统的more程序用来处理传递过来的数据,这样,就轻松实现的分页的效果。

pipe是半双工的通信机制,如果进程间要使用全双工的通信,可以创建两条管道来达到全双工的效果。另外,pipe匿名管道只能用来在拥有同一个父进程的进程间通信,*nix提供另外一个fifo(命名管道)可以让任意的进程之间实现通信,会在接下来的博客中来讲。

Python 相关文章推荐
Python挑选文件夹里宽大于300图片的方法
Mar 05 Python
Python创建xml的方法
Mar 10 Python
python脚本监控docker容器
Apr 27 Python
Python的requests网络编程包使用教程
Jul 11 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
基于数据归一化以及Python实现方式
Jul 11 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
Python matplotlib实时画图案例
Apr 23 Python
python如何正确使用yield
May 21 Python
python中如何对多变量连续赋值
Jun 03 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 Python
Python实现在Linux系统下更改当前进程运行用户
Feb 04 #Python
使用Python编写Linux系统守护进程实例
Feb 03 #Python
Python中使用select模块实现非阻塞的IO
Feb 03 #Python
Python异常学习笔记
Feb 03 #Python
Python中的迭代器漫谈
Feb 03 #Python
Python描述器descriptor详解
Feb 03 #Python
理解Python中的With语句
Feb 02 #Python
You might like
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python中的自定义函数学习笔记
2014/09/23 Python
Python模拟登录12306的方法
2014/12/30 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
安卓程序员求职信
2014/02/28 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
考博专家推荐信
2014/05/10 职场文书
企业文化演讲稿
2014/05/20 职场文书
企业晚会策划方案
2014/05/29 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
Oracle中update和select 关联操作
2022/01/18 Oracle