四种通信情况
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信号量
同步与互斥
互斥:同时只允许一个访问
同步:多个访问资源有顺序性
信号量是共享资源,相当于一个计数器
本质是对资源的预定机制
1万+

被折叠的 条评论
为什么被折叠?



