管道:也是文件,可以用于有血缘关系的进程间的通信。
实现机制:
两个或多个进程之间想要通信由于他们各拥有自己的地址空间所以必须有一块公共的空间,而这块空间就需要内核为他们提供,也就是缓冲区。
管道有两端一端负责输入,一端负责输出,所以两端就分别连接两个进程。进程1负责将数据输入到缓冲区,进程2将缓冲区的数据拿出来,这样就实现了两个进程的通信。

管道被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。

int pipe(int fd[2]);
功能: 创建一个简单的管道,若成功则为数组fd分配两个文件描述符,其中fd[0] 用于读取管道,fd[1]用于写入管道。
返回:成功返回0,失败返回-1;

#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#include<sys/wait.h>int main()
{
int _pipe[2];//标识管道的两种状态(0号为读端,1号为写端)
int ret=pipe(_pipe);
if(ret==-1)
{
printf("create pipe failed! error code is%d\n",errno);
return -1;
}
pid_t id=fork();
if(id<0)
{
printf("fork error!");
return 2;
}
else if(id==0)
{
//child
close(_pipe[0]);//关闭读端
int i=0;
char *mes=NULL;
while(i<10)
{
mes="i am child\n";
write(_pipe[1],mes,strlen(mes));
sleep(1);
i++;
}
close(_pipe[1]);//关闭写端
}
else
{
//farther
close(_pipe[1]);
char mes[100];
int j=0;while(j<10)
{
memset(mes,'\0',sizeof(mes));
int ret=read(_pipe[0],mes,sizeof(mes));sleep(1);
printf("%s:code is:%d\n",mes,ret);
printf("count:%ld\n",count);
j++;
}
if(waitpid(id,NULL,0)<0)//等待子进程
{
return 3;
}
}
return 0;
}

在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。

有两个 file 数据结构,但它们定义文件操作例程地址是不同的,其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。

关于管道的读写

管道实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数pipe_read()和管道写函数pipe_wrtie()。管道写函数通过将字节复制到 VFS 索引节点指向的物理内存而写入数据,而管道读函数则通过复制物理内存中的字节而读出数据。当然,内核必须利用一定的机制同步对管道的访问,为此,内核使用了锁、等待队列和信号。
当写进程向管道中写入时,它利用标准的库函数write(),系统根据库函数传递的文件描述符,可找到该文件的 file 结构。file 结构中指定了用来进行写操作的函数(即写入函数)地址,于是,内核调用该函数完成写操作。写入函数在向内存中写入数据之前,必须首先检查 VFS 索引节点中的信息,同时满足如下条件时,才能进行实际的内存复制工作:

·内存中有足够的空间可容纳所有要写入的数据;
·内存没有被读程序锁定。
如果同时满足上述条件,写入函数首先锁定内存,然后从写进程的地址空间中复制数据到内存。否则,写入进程就休眠在 VFS 索引节点的等待队列中,接下来,内核将调用调度程序,而调度程序会选择其他进程运行。写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号。当数据写入内存之后,内存被解锁,而所有休眠在索引节点的读取进程会被唤醒。
管道的读取过程和写入过程类似。但是,进程可以在没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式。反之,进程可以休眠在索引节点的等待队列中等待写入进程写入数据。当所有的进程完成了管道操作之后,管道的索引节点被丢弃,而共享数据页也被释放。

linux管道通信原理相关推荐

  1. linux进程通信1:进程通信概述,管道通信原理(无名管道,有名管道),管道编程实战

    进程通信概述,管道通信原理(无名管道,有名管道),管道编程实战 1.进程间通信概述: 举例1: 你手机微信和别人手机微信通信 举例2: 如:父子进程wait 和 exit之间的通信 进程间通信(IPC ...

  2. linux管道通信题目,操作系统实训(Linux)——习题解答、例题解析、实验指导-王红-实验实验7软中断及管道通信课案.ppt...

    操作系统实训(Linux)--习题解答.例题解析.实验指导-王红-实验实验7软中断及管道通信课案.ppt 实验7 软中断及管道通信 一.实验目的(1)掌握linux系统软中断通信的实现方法.(2)掌握 ...

  3. linux管道通信 半双工通信

    本文转载自:http://blog.sina.com.cn/s/blog_5ed3e6210100d87d.html 在windows里进程间的通信主要用到是的消息,而在Linux里管道通信是一个不错 ...

  4. linux----------2--3----(无名)管道通信原理及管道编程实战

    IPC的方式通常有管道(无名管道和命名管道),消息队列,信号量,共享存储,socket,streams等,其中socket和streams支持以不同主机上的两个进程IPC.(笔试题或面试可能会考,记住 ...

  5. Linux管道通信【操作系统】利用pipe

    实验内容: 编写一程序,建立一个管道.同时,父进程生成子进程 p1,p2,这两个子进程分别向管道中写入各自的字符串,父进程读出它们. 实验相关的系统调用: (1)pipe的创建 pipe(fd)< ...

  6. linux下进程间管道通信,Linux下进程间通信方式-管道

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...

  7. Linux进程通信:无名管道

    进程通信目的: (1)数据传输:进程间数据传输: (2)通知事件:一个进程向另一个或一组进程发送消息,通知某个事件的发生(如子进程终止时需通知父进程): (3)资源共享:多个进程共享资源,需要内核提供 ...

  8. Linux进程通信之管道

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

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

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

  10. 【流媒体服务器Mediasoup】 NodeJs与C++信令通信详解及Linux下管道通信的详解(五)

    目录 前言 匿名管道进程间通信 进程间管道 的创建与图解 MediaSoup中的管道创建 MediaSoup Channel的创建 NodeJs和 C++ 管道通信的过程 MediaSoup 消息确认 ...

最新文章

  1. 何崚谈阿里巴巴前端性能优化最佳实践
  2. Spring Boot2.0之 整合Redis集群
  3. 大数据入门基础教程系列
  4. java8压缩,如何使用Java 8压缩多个列表?
  5. mysql 回滚段_史上最牛分析MySQL索引机制的实现!不接受反驳
  6. 超云将成为数据中心演化的下一个阶段
  7. JPA学习笔记---JPA实体Bean的建立+配置文件+junit测试+自动生成(对应实体Bean的)数据库表+插入数据
  8. linux上运行onedrive,教你如何在Linux中同步微软 OneDrive
  9. 实战互联网公司数据存储解决方案
  10. 【网络流24题】魔术球
  11. 深度学习常见算法的介绍
  12. autocad不能画图_学了这50条CAD技巧,画图速度提10倍!
  13. Navicat for mac破解版
  14. 服装尺寸 html,服装尺寸对照表_衣服尺码:M、L、XL、XXL、XXXL 分别代表什么尺码...
  15. 华为HCIE-CloudComputing备考笔记-2021.10
  16. Google GDrive:不会是本地存储的终结者
  17. 数据在计算机中存储形式
  18. vue 在线访问word,excel,pdf 文件以及打印
  19. 中国信通院的星火链主链支持与以太链(测试网)交互
  20. 听力 JAVA_【VOA英语听力】 US Restarts Restrictions on Iran

热门文章

  1. 思科2960交换机telnet连接配置
  2. 这12张数据治理内涵图,你看懂了吗
  3. CF342E Xenia and Tree
  4. 赴日IT派遣,如何避免入坑
  5. 基于JSP的共享单车管理系统的设计与实现
  6. springboot打jar包部署在linux(阿里云)服务器上项目启动成功但页面访问时提示无法访问此网站
  7. 装了伽卡他卡打不开任务管理器的解决办法
  8. JAVA身份证阅读器数据返回图片
  9. windows计算机锁屏的快捷键是什么,win7的锁屏快捷键是什么 win7锁屏快捷键介绍【图文】...
  10. cascading基本概念