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处理PDF及生成多层PDF实例代码
Apr 24 Python
详解Python import方法引入模块的实例
Aug 02 Python
解决Mac安装scrapy失败的问题
Jun 13 Python
python批量赋值操作实例
Oct 22 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
在Pycharm terminal中字体大小设置的方法
Jan 16 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 01 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
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
jQuery实现增删改查
2020/12/22 jQuery
Python实现简单HTML表格解析的方法
2015/06/15 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
介绍一下mysql的日期和时间函数
2013/03/28 面试题
学校安全工作制度
2014/01/19 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
预备党员转正意见
2015/06/01 职场文书
呐喊读书笔记
2015/06/30 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
2019年入党思想汇报
2019/03/25 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
python中使用redis用法详解
2022/12/24 Redis