进程间通信方案

四种通信情况

1.写慢,读快  读端就要阻塞

2.写快,读慢  满了的时候,写就要阻塞等待·

3.写关,继续读  read就会读到返回值为0 表示文件结尾

4.读关 写端在写入 没意义 操作系统会杀掉写端进程 操作系统不会做没有意义的事情

读管道特性:

管道中有数据,read返回实际读取到的字节数
管道中无数据,且写端全部关闭,read返回0
管道中无数据,但写端没有关闭,read阻塞等待
写管道特性:

写管道时,读端全部关闭,进程异常终止,信号为SIGPIPE(管道破裂)。
写管道时,如果管道已满,write阻塞等待。管道大小为64K
写管道时,如果管道未满,write返回实际写入的字节数

终止进程的时候 要遍历管理子进程的vector

为啥不把关闭回收一块写

因为我们在创建多个子进程和管道的时候  子进程会拷贝父进程的文件描述符表

第一次父进程会把描述符3 4继承给第一个子进程

第二次父进程会把描述符3 5继承给第二个子进程 但4还保留着 也会被继承

以后每个继承的父进程都会拷贝 指向之前管道的写端

解决方案一:倒着关

关掉最后一个 最后一个中只有一个写入端

前面每一个进程都会少一个写入端 这样可以全部关掉

解决方案二:只让父进程指向写端

让子进程关闭继承哥哥进程的写端

不会关掉自己的 因为有写时拷贝

命名管道

匿名管道只能用于有亲缘关系的进程通信

两个进程都打开管道文件就好

特性与匿名管道一致

命名管道可以实现两个不相干的进程间通信

System V

System V共享内存

共享内存区时最快的IPC形式

Linux内核专门设计了一个IPC通信模块

IPC本质:让不同进程看到同一份资源

共享内存-System V

共享内存的原理:进程自身开辟一段空间 通过页表映射到同一块区域

关闭的时候各自free掉空间 再把页表映射取消掉 os释放内存

共享内存的接口

shmget,int shmget(key_t key, size_t size, int shmflg);创建共享内存

shmat,void *shmat(int shmid, const void *shmaddr, int shmflg);将共享内存端连接到进程地址空间

用key来区分共享内存的唯一性

共享内存的资源 生命周期随内核

共享内存的权限 共享内存也相当于是个文件 

共享内存是进程间通信中,速度最快的方式:

1.映射之后,读写直接被对方看到

2.不需要进行系统调用获取或者写入内容

通信双方没有所谓的同步机制

容易出现数据不一致的情况 

A写到一半就被B读走了

共享内存 没有保护机制

保护需要使用信号量

在内核中,共享内存在创建的时候大小必须是 4kb的整数倍

system V 消息队列

提供了从一个进程向另一个进程发送数据的方法

每个数据块都被认为有一个类型 接收者收的可以有不同的类型值

资源的生命周期随内核

消息队列调用接口

system V信号量

同步与互斥

互斥:同时只允许一个访问

同步:多个访问资源有顺序性

信号量是共享资源,相当于一个计数器

本质是对资源的预定机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值