一.进程间通信的目的:
1.数据传输:一个数据需要将它的数据发送给另一个进程;
2.资源共享:多个进程之间共享同样的资源;
3.通知时间:一个进程需要向另一个或一组进程发送消息,通知发生了什么事;如子进程终止时要通知父进程;
4.进程控制:有些进程希望完全控制另一个进程的执行,(如Debug进程);此时控制进程希望能够拦截另一个进程的所有缺陷和异常,并能够及时知道它的状态改变;
二.进程间通信的分类:
因为进程之间的独立性,进程之间无法直接进行进程间的通信;因此需要操作系统给用户提供一些公共的媒介让多个进程都能通过访问这个媒介进行进程间通信;也因为进程之间的通信场景有多种,因此操作系统提供了多样的通信方式;
管道:
1.什么是管道??
由于进程之间是相互独立的,因此在进程与进程之间进行相互联系的时候,此时就需要采用一种机制,通过管道的方式将进程一个进程的执行数据交给另外一个进程,此时就可以以通过管道来实现;
2.管道的分类:
(1)匿名管道: 内核中没有名字的缓冲区;只能用于具有亲缘关系的进程间通信,即子进程通过复制父进程的文件描述符表获取管道操作句柄;
(2)命名管道: 命名管道在内核中这块缓冲区是有标识的,意味着所有的进程都可以通过这个标识找到管道这块缓冲区实现通信;(可以用于同一主机上的任意进程间通信)
命名管道的标识是一个文件,可见于文件系统,意味着所有进程都可以通过打开文件进而访问到内核中的缓冲区;
关于管道的知识详解可参考博客:https://blog.csdn.net/DX_Jone/article/details/97944944
共享内存:
没有血缘关系的进程之间的通信虽然可以利用消息队列完成,但是在创建消息队列的时候,此时必须先将两个进程之间通过消息队列的类型来确认此时接受的消息是否正确,这样势必会造成两个进程之间的通信效率会降低;此时为了使得两个进程之间能够高效的进行通信,就提出了共享内存;共享内存是通过一段共享内存,将两个进程关联到这块内存,此时两个进程已经都关联到这块内存中;因此只要一个进程向这块内存中发送数据,此时另外一个进程就会看到这个消息,因此消息队列是块的IPC形式;
关于共享内存的知识详解可参考博客:https://blog.csdn.net/DX_Jone/article/details/97958030
消息队列:
为了实现任何进程之间的通信,此时就引入了消息队列;其中消息队列时基于一个一个的数据块的,同时数据块是有类型的,数据块也是有规定的最大长度的,系统中的消息队列的长度也是有限制的;发送者在进行发送的时候就需要将数据的类型进行标记,接收者在进行接受的时候就可以通过这个类型来直到这个数据是否来自发送方;
即操作系统在内核中为用户创建的一个队列;其他进程可通过访问相同的对列进行通信;消息队列传输的是自由类型的数据块;
关于消息队列知识的详解可参考博客:https://blog.csdn.net/DX_Jone/article/details/97962018
信号量:
信号量实际就是一个计数器,计数器中的数值代表的是当前资源的多少;信号量用于实现进程间的同步与互斥;