Python中使用PIPE操作Linux管道
作者:junjie 发布时间:2022-02-10 18:25:25
Linux中进程的通信方式有信号,管道,共享内存,消息队列socket等。其中管道是*nix系统进程间通信的最古老形式,所有*nix都提供这种通信方式。管道是一种半双工的通信机制,也就是说,它只能一端用来读,另外一端用来写;另外,管道只能用来在具有公共祖先的两个进程之间通信。管道通信遵循先进先出的原理,并且数据只能被读取一次,当此段数据被读取后,马上会从数据中消失,这一点很重要。
Linux上,创建管道使用pipe函数,当它执行后,会产生两个文件描述符,分别为读端和写端。单个进程中的管道几乎没有任何作用,通常会先调用pipe,然后调用fork,从而创建从父进程到子进程的IPC通道。
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(命名管道)可以让任意的进程之间实现通信,会在接下来的博客中来讲。


猜你喜欢
- 先导上一期讲了在ABAP中,ALV的普通写法,流程以及相关属性,还讲了基本DEMO ,但是在真正开发中,不会写这么多的代码.原则上是一切从简
- 本期给大家讲解的函数都不陌生,大家都遇到使用过,但是不要轻易觉得简单去学习,因为往往看似简单的东西,从一个方面深入下收都是一大堆的东西,千万
- os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录…… 但是,o
- 上一篇相关文章:段正淳的css笔记(2)圆角的做法 1、标题右侧“更多”的实现曾经做上图所示的效果,会使用到position来相对定位到h2
- 摘要:主要是讲解一些数据挖掘中频繁模式挖掘的Apriori算法原理应用实践当我们买东西的时候,我们会发现物品展示方式是不同,购物以后优惠券以
- 用python实现21点小游戏,供大家参考,具体内容如下from random import shuffleimport randomimp
- MS SQL基本语法及实例操作 一:建表并初始化 ============================ create database
- 在一些不多的数据下载和生成的时候,我们倾向于直接保存为文件,当我们修改某些参数后再一次运行时,之前运行时生成的文件就被覆盖了。为了解决这个问
- 多线程锁lock=threading.Lock()使用疑问多线程任务是同时执行的,如果我们需要先执行线程a,再执行线程b,需要怎么办呢?解决
- PyTorch最近几年可谓大火。相比于TensorFlow,PyTorch对于Python初学者更为友好,更易上手。
- golang 最吸引人的地方可能就是并发了,无论代码的编写上,还是性能上面,golang 都有绝对的优势学习一个语言的并发特性,我喜欢实现一
- 准备工作下载python,本文以python3.6为例。python3.6下载地址:python3下载地址,选择合适的版本安装。安装成功后,
- 本文实例讲述了Python文本统计功能之西游记用字统计操作。分享给大家供大家参考,具体如下:一、数据xyj.txt,《西游记》的文本,2.2
- 该组件基于技术栈,主要涉及vue-cli生成的webpack项目脚手架,在此脚手架项目基础上完成的,整合了element-ui开源vue的U
- 为了安全起见,需要经常对数据库作备份,或者还原。对于 MySQL 而言,最方便的方法可能就是用 phpMyAdmin 的导出、导入功能了,但
- 前言关于 var、let 和 const 三个关键字的区别,是一个老生常谈的问题,也是经典的面试题。本篇文章将全面讲解三者的特性,以及它们之
- 本文实例为大家分享了python批量文件重命名的具体代码,供大家参考,具体内容如下问题描述最近遇到朋友求助,如何将大量文件名前面的某些字符删
- Vue页面、组件之间传参方式繁多,此处罗列出常用的几种方式,欢迎审阅补充。一丶路由传参这里的路由传参以编程式 router.push(...
- 首先是最常规的方法: <p>test</p> <script> function test(){ ale
- 很多时候,希望能够在 HTML 中使用空格排版。但浏览器在解析 HTML 时,会把连续的空格解析成一个,所以我们会使用