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比较2个xml内容的方法
May 11 Python
浅析Python中的for 循环
Jun 09 Python
Python使用getpass库读取密码的示例
Oct 10 Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 Python
python实现一个简单的并查集的示例代码
Mar 19 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python实现列表的排序方法分享
Jul 01 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
python hough变换检测直线的实现方法
Jul 12 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
设置jupyter中DataFrame的显示限制方式
Apr 12 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 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
php数据库抽象层 PDO
2011/05/07 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
python zip文件 压缩
2008/12/24 Python
python的迭代器与生成器实例详解
2014/07/16 Python
python计算书页码的统计数字问题实例
2014/09/26 Python
Python实现定时任务
2017/02/08 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
荟萃全球保健品:维他购
2018/05/09 全球购物
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书