目录
一、为什么要进行进程间通信
进程间通信的目的
进程间通信的分类
二、什么是管道
2.1匿名管道
如何创建匿名管道:
#include <unistd.h>
功能:创建一无名管道
原型
int pipe(int fd[2]);
参数
fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端
返回值:成功返回0,失败返回错误代码
2.2用fork原理来共享管道
struct file是允许多个进程通过指针同时指向的,所以父进程最开始要按照rw打开同一个文件,因为匿名管道没有名字以及路径,只是内存中的一个缓冲区,而通过创建子进程来继承父进程的相关属性信息,从而来做到共享管道,传递信息。
这时就可以调用系统调用pipe来创建一个匿名管道,然后父子进程分别关闭读或写端,一个读一个写,从而来实现通信。
pipe不需要向磁盘中刷新并且磁盘中并不存在此文件,它创建出的是一个内存级的文件,也叫匿名文件,就是所谓的管道。
所以,看待管道,就如同看待文件一样!管道的使用和文件一致,迎合了“Linux一切皆文件思想”。
2.3匿名管道的四种情况和五种特性
假设我们让父进程担任读端,子进程担任写端,就会出现以下四种情况和五种特性:
四种情况:
1、管道内部没有数据&&子进程不关闭自己的写端文件fd,此时读端(父进程)就要阻塞等待,知道pipe有数据。
2、管道内部被写满&&父进程(读端)不关闭自己的fd,写端(子进程)写满之后,就要阻塞等待。
3、对于写端而言:不写&&关闭了pipe,读端会将pipe中的数据读完,最后就会读到返回值为0,表示读结束,类似读到了文件结尾。
4、读端不读&&关闭,写端在写,OS会直接终止写入的进程(子进程),通过信号13)SIGPIPE从而杀掉进程。
五种特性:
1、自带同步机制。
2、血缘关系进程进行通信,常见与父子。
3、pipe是面向字节流的。
4、父子退出,管道自动释放,文件的生命周期是随进程的。
5、管道只能单向通信,半双工的一种情况。
此时三个进程就是兄弟关系,创建了两个管道,这个管道命令,本质就是今天学习的pipe。