进程间通信 ─── linux第22课
进程间具有独立性 ,但是进程之间也需要数据传递等 ,管道应运而生.
进程间通信
进程间通信本质: 先让不同进程看到同一份资源.
进程间通信目的
- 数据传输:⼀个进程需要将它的数据发送给另⼀个进程
- 资源共享:多个进程之间共享同样的资源。
- 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发生了某种事件(如进 程终⽌时要通知父进程)。
- 进程控制:有些进程希望完全控制另⼀个进程的执行(如Debug进程),此时控制进程希望能够 拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。
进程间通信的发展
- 管道
- System V进程间通信
- POSIX进程间通信
进程间通信分类
1. 管道
匿名管道pipe
命名管道
2. System V IPC
System V 消息队列
System V 共享内存
System V 信号量
3. POSIX IPC
消息队列
共享内存
信号量
互斥量
条件变量
读写锁
管道
什么是管道
- 管道是Unix中最古老的进程间通信的形式。(只能单项通信)
- 我们把从⼀个进程连接到另⼀个进程的⼀个数据流称为⼀个“管道”
我们原来在命令行使用的管道 | ,在命令行中集连了两个命令
站在文件描述符角度-深度理解管道
下面是进程打开同一个文件后 ,在创建子进程的情况 ,我们可以发现在内存中加载的文件内核缓冲区可以同时被两个进程都看到(进程的内核数据结构+ struct file 被拷贝 ,文件部分不需要拷贝)
补充:
- 文件只需要打开一次即可 ,多进程打开时 文件的引用计数++
- struct file中存储着各自进程对该文件的读写位置 ,父子进程对文件从读写位置是独立的 , 所以在创建子进程时需要拷贝struct file
在此管道中 读是通过一个struct file 写是通过另一个struct file
问题:
要是不关闭管道? 导致fd泄漏&&误操作
先创建管道到再创建子进程,父子进程才能看到同一个管道
站在内核角度-管道本质
匿名管道
利用上面的原理,设计了一种文件(纯内存级 ,与磁盘外设无关 ,没有名字 ),通过它可以实现进程间通信.
创建匿名管道用系统调用命令 ─── pipe
#include <unistd.h>
功能:创建⼀⽆名管道
原型
int pipe(int fd[2]);
参数
输出型参数fd:⽂件描述符数组, 其中fd[0]表⽰读端, fd[1]表⽰写端
返回值:成功返回0,失败返回错误代码