目录
一、管道
二、消息队列
三、共享内存
四、信号量
五、信号
六、socket
一、管道
特点:传输数据是单向的,生命周期伴随着进程;
分类:类似“|”叫做匿名管道,还有fifo命令管道。
mkfifo命令可以用来创建命名管道;
创建管道调用的系统调用是:
int pipe(int fd[2])
其中返回值是两个文件描述符,fd[0]是读取的,fd[1]是写入的,由于采取流传输,大小有限制,且只能单向;
原理:对于匿名管道,它的通信范围是存在父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。
对于命名管道,它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持lseek 之类的文件定位操作。
缺点:效率低,不适合进程间频繁地读取数据;
优点:简单;
二、消息队列
特点:消息队列是保存到内存中的消息链表,两个进程可以约定好放入同一个消息队列,生命周期是伴随着内核的;、
原理:类似邮件,一方寄一方收即可;
缺点:通信可能不及时,不适合传输大数据,因为消息的长度大小都是有限制的,而且存在用户态和内核态的数据拷贝开销;
三、共享内存
特点:没有内核态和用户态数据拷贝开销;
原理:每个进程都有自己的虚拟内存空间,共享内存就是给两个需要通信的进程的虚拟内存映射到同一个共享内存(物理内存),一方修改了数据,另一方可以直接看到;
缺点:多个进程不能同时修改同一个地址,因此需要与信号量一起使用;
四、信号量
特点:信号量其实是一个整型的计数器,用来实现多个进程间的同步和互斥;
原理:有两种原子操作:PV操作,P代表信号量-1,如果-1后信号量的值<0,就会阻塞;V代表信号量+1,如果+1后<=0,会唤醒阻塞的进程;
五、信号
特点:信号是进程间唯一的异步通信机制,任何时候有信号产生,都有三种处理方式:
1、执行默认行为,2、注册自己的处理函数用来捕捉信号,3、忽略信号。
六、socket
特点:socket除了本机进程间通信,还可以跨机和跨网络在不同的两个主机间通信。文章来源:https://uudwc.com/A/Y1a8G
原理:有三种通信方式,tcp、udp、本地进程间(本地文件)文章来源地址https://uudwc.com/A/Y1a8G