Linux -- 进程间通信之管道
管道是 Linux 里的一种文件类型,同时也是 Linux 系统下进程间通信的一种方式
创建一个管道文件有两种方式:
- Shell 下命令 mkfifo + filename,即创建一个有名管道
- C 语言里调用 pipe() 函数,创建一个无名管道
有名管道 / 无名管道
区别:
- 有名管道在程序外部使用 mkfifo 命令生成,无名管道在程序内部调用 pipe() 函数创建;
- 顾名思义,有名管道有文件名,无名管道没有文件名;
- 有名管道生成后直到删除都存在,无名管道在程序退出时则生命周期结束;
- 有名管道可以在任意两个进程间传输数据,无名管道只能在父子进程间传输数据;
注意:有名/无名管道都是半双工,即只能从一端向另一端发送数据,输入端与输出端在打开管道时是固定的
管道文件的特性
- 打开管道必须有两端(两个进程)同时打开一个管道,分别为读(r)和写(w);读取端负责从管道中读取数据,写入端负责向管道中输入数据;
- 当读端关闭,写端会收到信号,终止程序;当写端关闭,读端不再进入阻塞;
- 管道文件的大小始终为 0,打开管道文件时,在内存中为其分配空间,管道关闭后数据消失;Linux 默认 PIPE_SIZE(一个管道最大存储大小)为 64k,PIPE_BUF(管道缓冲区)为 4k;当对管道进行 write 操作时,若此时有多个进程同时写入一个管道,且写入的字节大小超过 PIPE_BUF,则写操作的数据有可能相互穿插

管道文件的内存空间有两个指针 head / tail ,head 指针随读取数据向后移动,tail 指针随写入数据向后移动,当指针到文件尾时,会造成读阻塞 (读取结束)/ 写阻塞(空间已满)
注意
当我们调用 pipe() 创建无名管道后 fork() 以实现父子进程间通信,此时 pipe() 生成的两个 r/w 描述符引用都会加一,在父子进程中同时存在 r/w 两个描述符,此时应当在父子进程中分别 close 不用的描述符,使 r/w 端只存在一个引用,这样父子进程间通信时可以正常读写响应
Linux -- 进程间通信之管道的更多相关文章
- Linux 进程间通信(二) 管道
Linux 进程间通信-管道 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源.但是,进程不是孤立的,不同的进程之间需要信息的交换以及 ...
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- Linux进程间通信之管道
1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...
- Linux进程间通信(一) - 管道
管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道. 例如:ps | grep vsftpd .管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准 ...
- linux进程间通信-有名管道(FIFO)
有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的 ...
- Linux进程间通信-命名管道
前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...
- Linux进程间通信-匿名管道
前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用. ...
- linux进程间通信--有名管道
有名管道 只有当一个库函数失败时,errno才会被设置.当函数成功运行时,errno的值不会被修改.这意味着我们不能通过测试errno的值来判断是否有错误存在.反之,只有当被调用的函数提示有错误发生时 ...
- linux进程间通信--无名管道
管道 只能用于具有亲缘关系的进程之间通信是一个半双工的通信模式, 具有固定的写读端和写端,管道可以看成一种特殊的文件,对它可以使用普通的read.write等操作 管道的创建: #include &l ...
随机推荐
- Swift UIViewController中的delegate方式传值
ios swift开发中有几种方式传值,看到简书上一篇不错的文章. 链接:http://www.jianshu.com/p/3e1173652996 一.通过segue进行传值 二.通过delegat ...
- oracle 特殊符号替换删除处理
1 获取ascii码 select ascii('特殊字符') from dual 2 替换 update table set testfield= replace(testfield,chr(asc ...
- podman初试-和docker对比
podman初试-和docker对比 1,什么是docker? Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单易用的容器使用接口,让开发者可以打包他们 ...
- MAC配置JAVA环境变量
一.下载安装文件 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html jdk-8u144-macosx-x64. ...
- jq实现多选框及反选
1 效果图 2 html <div class="main"> <table> <tr> <th><input type=&q ...
- Python - selenium自动化-Chrome(headless)
什么是 Headless Chrome Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序.相比于现代浏览 ...
- JS 原生面经从入门到放弃 篇幅较长,建议收藏
前言 是时候撸一波 JS 基础啦,撸熟了,银十速拿 offer; 本文不从传统的问答方式梳理,而是从知识维度梳理,以便形成知识网络; 包括函数,数组,对象,数据结构,算法,设计模式和 http. 函数 ...
- 初识web API接口及Restful接口规范
一.web API接口 什么是web API接口?: 明确了请求方式,提供对应后台所需参数,请求url链接可以得到后台的响应数据 url : 返回数据的url https://api.map.baid ...
- linux系统LAMP环境部署
一.安装虚拟机 二.安装CentOS7 注意:以下安装,用的root权限. 三.安装Apache 1.安装 yum -y install httpd 2.开启apache服务 systemctl st ...
- [Office] Resources for Office Development
Office 2013 Document (.chm) download page: http://www.microsoft.com/en-us/download/details.aspx?id=4 ...