进程间通信(IPC):操作系统为用户提供的几种进程间通信方式
基本介绍: 因为进程的独立性,进程之间无法直接沟通,需要操作系统提供一块公共的媒介实现通信,因为通信的场景各有不同,因此操作系统也提供了不同的进程间通信方式
- 通信场景: 数据传输,数据共享,进程控制,事件通知
- 通信方式: 管道,共享内存 ,消息队列,信号量
- 管道: 传输数据资源—半双工通信(双向选择,单向通信)(管道特性之一),有匿名管道和命名管道
- 管道的本质: 内核当中的一块缓冲区——多个进程通过访问同一块缓冲区实现数据传输通信
- 匿名管道:
只能用于具有亲缘关系的进程间通信,没有表示能被其它找到在内核中创建管道,操作系统
返回两个描述符作为管道的操作句柄,对管道的操作就是基础IO操作(提供两个描述符是因为——管道是双向选择)
匿名管道仅能用于具有亲缘关系的进程间通信,通过复制父进程获取管道的操作句柄。
管道的读写特性:
管道中若没有数据,则read会阻塞;若管道中数据满了,则write会阻塞
若管道所有写端被关闭,则read读完数据后返回0(而不是阻塞)
(read返回0,表示管道没人写了(写端全部被关闭),则没有必要再继续读)
若管道所有读端被关闭,则write写数据会触发异常(导致进程退出)退出–SIGPIPE
ls | grep make
因为管道的读写特性,用户在操作管道的时候最好是没有用到哪一端,则关闭掉
ls | grep make|grep -v test
管道自带同步与互斥:(当对管道读写大小小于PIPE_BUF-4096时,保证操作原子性)
原子性操作:操作不可打断
同步:对临界资源访问的时序可控性(时序控制–我操作完了别人才能操作)保证数据操作的合理性 ,时序关系
互斥:临界资源的同一时间唯一访问性(保护–我操作的时候别人不能操作)保证数据操作的安全性,同一时间唯一访问
【中国——强——小红没来——小明没来——】
【中国小红小明强——没来——没来——】
管道提供字节流服务–传输方式灵活–但是会造成数据粘连(本质原因:数据之间没有边界)
管道生命周期:随进程
匿名管道仅能用于具有亲缘关系的进程间通信,命名管道能用于任意进程间通信
命名管道:管道有名字–名字的体现方式就是在文件系统中具有一个管道文件
管道文件:可用于同一主机上任意的进程间通信,
—表示就是文件系统的管道文件
—就是命名管道的名字—给任意进程提供通过打开同一个命名管道进而访问到内核中同一块管道缓冲区的功能
管道缓冲区的功能
mkfifo命令创建命名管道文件
命名管道的打开特性:
若管道文件没有以写的方式打开,则只读打开会阻塞
若管道文件没有以读的方式打开,则只写打开会阻塞
命名管道读写特性雷同于匿名管道