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 strip lstrip rstrip使用方法
Sep 06 Python
Python压缩和解压缩zip文件
Feb 14 Python
python实现查询苹果手机维修进度
Mar 16 Python
Python中用Decorator来简化元编程的教程
Apr 13 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
python实现反转部分单向链表
Sep 27 Python
python利用Tesseract识别验证码的方法示例
Jan 21 Python
python argparser的具体使用
Nov 10 Python
Python解析多帧dicom数据详解
Jan 13 Python
python 实现任务管理清单案例
Apr 25 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
PHP反射实际应用示例
2019/04/03 PHP
JavaScript的目的分析
2007/01/05 Javascript
javascript Prototype 对象扩展
2009/05/15 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
vue.js的提示组件
2017/03/02 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
js操作二进制数据方法
2018/03/03 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
在Python的web框架中配置app的教程
2015/04/30 Python
Python快速从注释生成文档的方法
2016/12/26 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
python实现图片横向和纵向拼接
2020/03/05 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
暑期社会实践感言
2014/02/25 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
安全保证书怎么写
2015/02/28 职场文书
食堂卫生管理制度
2015/08/04 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书