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和C/C++交互的几种方法总结
May 11 Python
python实现日常记账本小程序
Mar 10 Python
python组合无重复三位数的实例
Nov 13 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
利用arcgis的python读取要素的X,Y方法
Dec 22 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
Python对象的属性访问过程详解
Mar 05 Python
aws 通过boto3 python脚本打pach的实现方法
May 10 Python
keras 权重保存和权重载入方式
May 21 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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 高性能书写
2010/12/11 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
详解YII关联查询
2016/01/10 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
javascript连续赋值问题
2015/07/08 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
Python ZipFile模块详解
2013/11/01 Python
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python中title()方法的使用简介
2015/05/20 Python
python 获取url中的参数列表实例
2018/12/18 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
应届大学生的推荐信
2013/11/20 职场文书
应届大学生求职信
2013/12/01 职场文书
2015年采购部工作总结
2015/04/23 职场文书
2016继续教育研修日志
2015/11/13 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
Java 关于String字符串原理上的问题
2022/04/07 Java/Android