1.基本原理

管道是最基本的IPC(InterProcess Communication)进程间通信

我们知道进程有4G的虚拟内存,其中0到3G是独立的进程空间,每个进程不相互通,而3G-4G是公用的内核空间。要实现在进程间传递数据,管道就是利用这公用的内核空间来完成,即利用内核的一块缓冲区

2.基本使用

#incldue<unistd.h>

int pipe(int fd[2]);

fd返回两个文件描述符fd[0]为读,fd[1]为写。fd[1]的输出是fd[0]的输入。

通过文件描述符去索引管道,单向通信。

先pipe,后fork。

测试代码如下:

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main(){int fd[2];pid_t pid;char str[1024]="hello itcast";char buf[1024];//fd[0] 读端//fd[1] 写端if(pipe(fd)<0){perror("pipe");exit(1);}pid=fork();//父写子读if(pid>0){//关闭父读close(fd[0]);sleep(2);write(fd[1],str,strlen(str));wait(NULL);}else if(pid==0){int len;//子进程关闭写端close(fd[1]);len=read(fd[0],buf,sizeof(buf));//读时共享,写时复制 可以直接读str
//        sprintf(str,"child %s",buf);write(STDOUT_FILENO,buf,len);}else{perror("fork");exit(1);}return 0;
}

2.两个局限性

(1)管道是半双工的(即数据只能在一个方向上流动)

(2)只能在具有公共祖先的两个进程之间使用(具有血缘关系)

(1)方向性

根据其特点,管道是用数据结构--环形队列完成的,写端入队,读端出队。

若队列满了,就会阻塞,等到有空间继续运行。

(2)血缘性

首先要确定父写子读,还是子写父读

为什么不能双向?

因为父子进程中PCB的文件描述符相同,指向同一个file结构体,若都写或者都读,造成歧义,会造成通信的混乱。

注意事项: 

13)信号SIGPIPE

fpathconf(int fd ,int name)测试管道缓冲区大小,"

"name"参数_PC_PIPE_BUF

测试大小为64K

pipe管道—进程通信相关推荐

  1. Linux进程通信(一)——pipe管道

    本章内容 采用pipe管道如何进行进程之间的通信 pipe管道进程通信的规则和限制 Linux中pipe管道的实现机制和管理pipe管道的结构体 什么是进程通信 进程通信就是两个进程之间进行数据交换, ...

  2. pipe管道实现进程间的通信

    pipe 1.管道由pipe函数创建 2.管道的本质是伪文件(不占用磁盘空间,只占用内存) 3.管道由两个文件描述符的引用,一个fd[0]读,一个fd[1]写 4.数据从管道的写端流入,读端流出 5. ...

  3. php管道邮件,php进程通信-PIPE管道通信

    上一篇文章讲到了php进程通信的进程信号通信方法,本文介绍的是有名管道: 管道通信,主要是利用文件,写入以及读取来进行通信的, 通俗来讲,就是A进程在1.txt写入1,B进程读取1.txt,就能读取到 ...

  4. 【并发编程三】C++进程通信——管道(pipe)

    [并发编程三]C++实现通信--管道(pipe) 一.管道(pipe) 二.匿名管道 1.简介 2.父子进程:匿名管道的通信过程? 3.相关函数 3.1.创建管道CreatePipe 3.2.写入管道 ...

  5. 进程通信之二 管道技术第二篇 匿名管道

    上一篇<进程通信之二 管道技术第一篇 输入输出的重定向>示范了增加若干程序代码来完成程序输入输出的重定向,并提出了如果没有程序源代码,只有程序文件如何来完成重定向.本篇就介绍如何使用匿名管 ...

  6. linux 进程通信 pipe

    pipe函数 管道函数 man pipe #include <unistd.h> int pipe(int pipefd[2]);参数介绍:pipefd读写文件描述符,0-代表读, 1-代 ...

  7. Linux进程通信之管道

    进程间完成数据传递需要借助操作系统提供的特殊的方法,比如:文件.管道.信号.共享内存.消息队列.套接字.命名管道等.但现在常用的进程间通信方式有: 管道 – 使用最简单 pipe 管道一般读写行为 F ...

  8. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  9. 进程通信:匿名管道和命名管道

    一.进程间通信方式 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 有名管道 (named pipe) : ...

最新文章

  1. cstring只获取到第一个数_一文讲透 Dubbo 负载均衡之最小活跃数算法
  2. Android SlideAndDragListView,一个可排序可滑动item的ListView
  3. Android开发之自定义dialog的实现(源代码分享)
  4. Kotlin实战指南六:可空类型、非可空类型
  5. 记录 之 不同的Normalization方式
  6. php月历,PHP生成月历代码
  7. java重写重定向_JavaWeb请求转发与请求重定向理解
  8. 科研|饶毅:科学在被淘汰的博士后引领下狂奔
  9. Redis哈希表总结
  10. 创建数据库、表以及索引
  11. 第三章:顺序栈及其应用之三---数制转换
  12. HTML的form表单标签
  13. 滴滴android面试算法,滴滴打车面试经验
  14. 初探单点登录 SSO
  15. 如何成为一名数据分析师 | 推荐收藏
  16. Pyhton之模拟石头剪子布游戏篇
  17. 计算机考研 | 2020我计算机考研为什么会失败+复盘(备战2022)
  18. 系统重构的原则代码重构的原则
  19. 28BYJ-48单极性步进电机
  20. 关于Keil开发C51单片机的头文件问题

热门文章

  1. php之webservice限制ip,PHP语言之WSF/PHP调用带有WS-Security支持的WebService时的注意事项...
  2. 90-新垃圾回收机制说明
  3. MLX90640 红外热成像仪测温传感器模块开发笔记(十) 成果展示-红眼睛相机
  4. luogu P3643 [APIO2016]划艇
  5. 这 10 种Numpy高级操作你都会吗?
  6. 真北读书 | 高标准才能《质量免费》
  7. 零基础HTML入门教程(17)——表单的单选框和复选框
  8. ORACLE自动启动脚本
  9. 责任链模式以及应用场景
  10. 将pcap文件处理成KDD99数据集格式