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海龟绘图实例教程
Jul 24 Python
Python数据库的连接实现方法与注意事项
Feb 27 Python
对numpy中轴与维度的理解
Apr 18 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
linux查找当前python解释器的位置方法
Feb 20 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
python实现自动打卡的示例代码
Oct 10 Python
如何用Python提取10000份log中的产品信息
Jan 14 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
JavaScript基本对象
2007/01/11 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
js读取本地文件的实例
2017/12/22 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
python使用7z解压apk包的方法
2015/04/18 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
Python 获取div标签中的文字实例
2018/12/20 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
python实现智能语音天气预报
2019/12/02 Python
python实现FTP循环上传文件
2020/03/20 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
《商鞅南门立木》教学反思
2014/02/16 职场文书
聘用意向书范本
2014/04/01 职场文书
支部鉴定材料
2014/06/02 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
承诺保证书格式
2015/02/28 职场文书
2015小学师德工作总结
2015/07/21 职场文书
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python
golang 语言中错误处理机制
2021/08/30 Golang
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
Nginx配置https的实现
2021/11/27 Servers