【linux】进程间的通讯(一)

打印 上一主题 下一主题

主题 843|帖子 843|积分 2529

1. 相识进程通讯

两个大概多个进程实现数据层面的交互
因为进程独立性的存在,导致进程通讯本钱较高(通讯必要本钱)

2. 进程间通讯目标


  • 进程间通讯的本质是,让差别的进程看到同一份"资源"(即同一份内存空间)
  • 这个"资源"一样平常是由操作体系提供的,不是某一个进程独有的,就不会粉碎进程的独立性
  • 进程访问这个资源,进行通讯,本质是访问操作体系,进程代表的是用户,"资源"从创建,利用,到释放 ------- 都是调用了体系调用接口

3. 进程间通讯发展

 


  • 管道(属于文件级别的通讯方式)
  • System V进程间通讯
  • POSIX进程间通讯

留意:
一样平常操作体系,会有一个独立的通讯模块,隶属于文件体系,IPC通讯模块会订定标准,所以进程间通讯是有标准的

4. 进程间通讯分类

(一)管道



  • 匿名管道pipe
  • 命名管道

(二)System V IPC



  • System V 消息队列
  • System V 共享内存
  • System V 信号量

(三)POSIX IPC



  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

5. 管道

(一)认识管道

管道是Unix中最古老的进程间通讯的情势
我们把从一个进程连接到另一个进程的一个数据流称为一个“管道"
(二)匿名管道

画图表明


   留意:
  

  • 匿名管道本质上也是一个文件,只是缓冲区的数据不会刷新到磁盘里面
  • 弄成读写端,是为了包管管道单向通讯
  
(三)实例代码

   pipe函数
  功能:创建一无名管道
  
  头文件
  #include <unistd.h>
  
  原型
  int pipe(int fd[2])
  
  参数
  fd:文件形貌符数组,其中fd[0]表现读端, fd[1]表现写端
  返回值:乐成返回0,失败返回错误代码
   
   留意:
  匿名管道适用于的两个进程必须是有血缘关系,比如父子关系,兄弟关系,爷孙关系等等
  
(四)用fork来共享管道原理

由于子进程的进程PCB都是拷贝父进程的,所以子进程创建时(如果父进程一开始利用pipe函数,创建了匿名管道,并且只打开了读端),子进程本应该只能拿到写端(包管进程单向通讯),但是由于继承了父进程的写端,容易导致不能达成单向,所以记得关闭多余的读写端



(五)管道读写规则


  • 读写端正常,管道如果为空,读端会阻塞
  • 读写端正常,管道被写满,写端会阻塞
  • 读端正常读,写端关闭,读端会读到0,表明读到管道末了,不会被阻塞
  • 读端关闭,写端正常,操作体系就要杀掉正在写入的读端(通过信号杀死)

   留意:
  管道是有固定巨细的,差别内核里,巨细有所差别
  
(六)管道特点

1. 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通讯:通常,一个管道由一个进程创
建,然后该进程调用fork,此后父、子进程之间就可应用该管道

2. 管道提供流式服务
一样平常而言,进程退出,管道释放,所以管道的生命周期随进程
一样平常而言,内核会对管道操作进行同步与互斥

3. 管道是半双工的,数据只能向一个方向流动;必要双方通讯时,必要建立起两个管道

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表