进程:进程是计算机运行的基本单位,利用多进程可以实现系统的多任务;但是,在多进程的任务中,进程之间的通信是比较麻烦的,因为,进程之间使用的是不同的进程空间,所以,编写多进程的系统,首先要决解进程之间的通信。
linux/unix下的进程间的通信主要分为两大类:
1、基于文件的IPC;
2、基于内存的IPC;;
基于文件的IPC又可以分为以下几类:基于普通文件的IPC、基于管道文件的IPC、基于socket文件的IPC。基于内存的IPC包括:基于共享内存的IPC,基于共享队列的IPC,基于信号量的IPC。
普通文件的IPC:使用普通文件的IPC是决解进程间通信的最基本方式,进程访问和操作普通文件;但是,基于普通文件IPC的一个主要技术问题是,一个进程改变了该文件,但是其他无法感知到文件的变化,为决解这个问题,可以使用一个特殊的文件:管道文件。
基于管道文件的IPC:管道是进程间通信的主要手段之一。管道文件实际上是一个只存在于内存中的文件,对管道的操作实际是对两个文件的操作,分别表示对管道文件的读和写,根据管道的创建方式,管道文件可以分为普通管道和匿名管道;但是,匿名管道只能使用在父子进程之间。
基于socket的IPC:基于socket的IPC主要使用在网络编程之中,是一种比较重要的文件通信方式。基于文件的IPC主要分为两种模型:对等模型和C/S模型,对等模型主要用于udp编程,而C/S模型主要用于Tcp编程。
基于内存的IPC:在介绍基于内存的IPC之前,首先要先介绍一下一组内核内存的工具(ipcs),ipcsipcs命令往标准输出写入一些关于活动进程间通信设施的信息,ipcs可以指定查看的具体信息,如ipcs -m 查看共享内存, -q:查看共享队列,ipcs -s查看共享信号量,以上3中都不指定时则是查看共享内存、共享队列和共享信号量;
基于共享内存的IPC:基于共享内存的编程模型是:首先需要创建(得到)一个共享内存,得到一个ID;然后把该ID对应的共享内存映射为虚拟地址(挂载);然后就可以使用虚拟地址访问内核的共享内存(使用与内存相关的函数和运算符号);最后就是卸载虚拟地址和删除共享内存。
基于共享队列的IPC:基于共享队列的编程模型是:首先需要创建(得到)共享队列;然后使用共享队列;最后记得删除该共享队列。
基于信号量的IPC:信号量是共享内存整数数组,根据需要定义指定数组的长度,信号量就是根据数组中的值,决定阻塞还是解除阻塞;基于信号量的编程模型是:创建(得到)信号量;然后初始化信号量中指定下标的值;然后根据信号量阻塞或者是解除阻塞;最后删除信号量。
对linux/unix的进程间通信的基本方式介绍到此;详细的内容将分别进行描述。
来源:oschina
链接:https://my.oschina.net/u/861360/blog/182371