现在虽说有各种各样的中间件来处理进程间通讯,但知道linux本身提供的进程间通讯方式还是很有必要的。
Linux间通讯主要有以下几种:
1.管道
a) 匿名管道
b) 命名管道
2.套接字
3. 共享内存
4.信号
5.消息队列
下面主要讲下常用的管道、套接字、共享内存
管道通信
管道有两种,一种是适合父子进程间通讯的匿名管道,另外一种是不相关进程的命名管道。
1.匿名管道
使用pipe来创建管道,我们来看一下这个函数原定义:
int pipe(int filedes[2])
这个函数返回一个管道数组,一个读、一个写。只要内存足够大,可以随便写。如果发现内存不够,则会阻塞。
2.命名管道
顾名思义,就是给管道取了个名字,以便两个进程访问。其定义如下:
int mkfifo(const char *filename, mode_t mode);
在创建成功后,两个进程即可使用文件API来操作,使用open来打开, read,write来读写
套接字
socket一般使用在两台不同IP的机器上的进程通讯,虽然同一台机器上两个进程也可以通过环回接口来通讯,但效率不高。
不过linux提供了另外一种socket类型来解决这个问题,通过设定套接字类型为PF_UNIX 及指定地址(而不是IP地址)来解决本地进程通讯的问题。传统socket会经过协议层的编码解码且经过网卡,并受网卡带宽限制,而本地套接字则没有此种过程,内核直接根据指定的地址,拷贝数据,如此效率得到极高的提升。
共享内存
如其名,就知道是两个进程访问同一块内存来进行读写,则不存在数据的拷贝了,这个也分三种:
1.mmap共享内存映射
2.XSI共享内存
3. POSIX共享内存映射
mmap适用于父子进程,通过mmap映射出一块内存,然后把地址传给子进程,就可以共享内存了。
XSI共享内存则是为解决非父子进程的通讯而生,其通过使用一个约定好的文件路径和projectid来生产一个key,两个进程通过该key获取内核创建好的共享内存,进而把共享内存映射到本进程的虚拟地址就可以使用了。
POSIX共享内存与上面的两种没太大区别,只是为了创建负责linux的价值观(万物皆文件)来提供一套专门的API。