-
目录
1.为啥需要进程间通信呢?
-
1.1原因:
- 每一个进程的数据都足存储在物理内存当中,进程通过各自的进程虚拟地址空间进行访问,访问的时候,通过各自的页表的映射关系,访问到物理内存。从进程的角度看,每个进程都认为首己拥有4G的空间,至 于物力内存当中属于如何存储,页 表如何映射,进程是不清楚。 这 也造就了进程的独立行。
-
1.2进程独立性:
- 好处:让每- -个进程在运行的时候,都是 独立进行运行的,数据不会窜。
- 坏处:如果两个进程之间需要数据交换,那么由于进程独立行, 就没有那么方便 了
- 所以:进程问通信本质上是进程和进程之间交换数据的手段。
-
1.3.常见的进程间通信方式:
- 管道/共享内存/消息队列/信号量/信号/网络
- 网络是最大的进程间通信方式
-
-
2.管道
2.1.匿名管道:
-
1.管道符号
- ps aux | grep xxx
-
2.2 管道的本质
- 管道在内核当中是块缓冲区, 供进程进行读写, 交换数据
-
2.3管道的接口
- 1.3.1理解参数的含义
- int pipe(int pipefd[2]);
- 作用:
- 创建匿名管道:也就是在内核创建出来一个缓冲区
- 参数:
- 参数为出参,也就是pipe fd的值是p ipe函数进行填充的,调用者进行使用
- pipefd是数组,有两个元素
- pipefd[0] :管道的读端
- pipefd[1] :管道的写端
- 返回值:
- 0:创建成功
- -1:创建失败
- 作用:
-
2.4从PCB的角度理解管道
-
2.5代码验证
- 2.5.1、验证pipe函数:创建一个管道
- 程序运行输出3,4
- 查看输出参数是否是文件描述符
- 查看详细信息可以看到3,4分别对应管道的读端和写端
- 我们测试一下看从fd[0]读,从fd[1]中写
- 可以看到读写成功
- 2.5.2、结合父子进程,让父子进程进行通信
- 我们发现父子近进程通信成功
- 现象解释:父子进程打开内核中管道缓冲区,子进程打开一个读端一个写端,父进程打开一个读端一个写端。子进程关闭自己读端还可以写入,但是不可以读了。父进程同理。
- 2.5.3:接下来我们关闭子进程的写端,让子进程写入,父进程关闭读端,让父进程读取。
- 我们发现父进程无法读取内容
- 2.5.1、验证pipe函数:创建一个管道