朋友们、伙计们,我们又见面了,本期来给大家带来进程间通信相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!
C 语 言 专 栏:C语言:从入门到精通
数据结构专栏:数据结构
个 人 主 页 :stackY、
C + + 专 栏 :C++
Linux 专 栏 :Linux
目录
1. 进程间通信
1.1 进程间通信的目的
- 数据传输:一个进程需要将它的数据发送给另一个进程
- 资源共享:多个进程之间共享同样的资源。
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
进程间通信的本质:先得让不同的进程看到同一份资源。这个资源不能由进程双方的任何一方提供,通常是由OS提供。
1.2 进程间通信的分类
管道
- 匿名管道pipe
- 命名管道
System V 进程间通信
- System V 消息队列
- System V 共享内存
- System V 信号量
POSIX 进程间通信
- 消息队列
- 共享内存
- 信号量
- 互斥量
- 条件变量
- 读写锁
2. 管道
我们之前在命令行使用的 | 就是一种管道,那么我们在命令行使用管道,它肯定会在底层给我们转化成对应的操作;
- 管道是Unix中最古老的进程间通信的形式。
- 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”
![]()
2.1 匿名管道
- 当一个进程打开一个文件时,会给其分配对应的文件描述符,新打开的文件里面主要的是文件的inode(保存文件属性)、方法集(对应的读写方法)、文件页缓冲区;
- 文件的PCB、描述文件结构体对象都是属于进程管理操作;文件描述符的分配管理属于内存操作,两者互不相干;
- 此时如果调用fork创建子进程时,新创建的子进程根据父进程PCB为模版创建自己的PCB,子进程的文件描述符的指向和父进程指向一致(并不会重新分配);
- 所以父进程打开的文件此时也会被子进程看到,这样子就形成了两个进程看到同一份资源,具备了进程间通信的条件;
- 当父进程想往文件写入数据时,子进程也可以看见,但是父进程向该文件写入时,不需要再刷新到磁盘,然后子进程再从磁盘读入数据,这样效率太低下(访问外设),所以这个文件就是纯内存级文件,这个文件叫做管道文件;
- 该管道文件可以不需要名字,并且用于父子进程通信,该管道叫做匿名管道;