之前我们学习了进程以及基础IO的相关知识,所以进程之间我们知道都是具有独立性的(通过写时拷贝和虚拟地址空间),那么如果我们今天想让不同的进程之间进行资源的交互,也就是说进程A想看到进程B发过来的信息并及时接收它,那么我们仔细想想这不就是和进程的独立性相违背了吗 ❓❓❓
因为我们之前说,如果打开一个文件,并且父进程创建了子进程,那么子进程其实就会拷贝父进程的大部分属性和内容,包括文件描述符表等,也就是说如果父进程指向了一个打开的文件,那么子进程也是会指向那个打开的文件。此时如果某一端进行写入的话,那不就会触发写时拷贝吗,那么两个进程之间不就看不到所谓的资源交互了吗 ❓❓❓
所以对我们来说,进程之间的通信的成本肯定是不低的,因为我们必须打破它独立性的原则!
下面我们就得先知道什么是通信,为什么要有通信以及如何通信的概念!
要知道我们日常生活中设计出来的程序不可能一直在本地中的单个程序做自己的事情,大部分时间程序之间或者说进程之间必须要有信息资源的交互才能使得设计逻辑成立,所以通信就是为了让程序或者进程之间搭建起一条桥梁,让它们可以共享某段资源并且进行交互!有时候我们需要多进程协同的,完成某种业务内容。比如管道。所以一共有以下几个目的:
进程间通信的本质:OS
需要直接或者间接给通信双方的进程提供一段特殊的 “内存空间”,并且必须让通信的进程看到一份公共的资源。
而我们所说的不同通信种类本质就是:这段特殊的 “内存空间” 是 OS
中的哪一个模块提供的就是哪种通信。如文件系统提供的叫管道通信;OS
对应的 System V
模块提供的就是 System V
通信,如果是共享内存,就是共享内存通信等等
通信其实也就是分为两大步,第一步就是我们要让不同的进程之间看到同一份资源,第二步则是通信!
上面所说的第二步一定是基于第一步的,而我们接下来学习的内容主要是围绕第一步来展开的,也就是如何让进程间看到同一份资源,以下就是几种常见的通信手段:
接下来我们会先介绍到管道的内容,让我们对通信的概念打下基础,接着会稍微接触点 System V
通信,因为其现在不是主流,并且只能在本地通信使得局限性很大,所以我们对 System V
不会花太多时间,最后会将重点放到 POSIX
通信手段上!