进程间通信简介
进程间通信简介
进程间进程简称IPC(interprocess communication),进程间通信就是在不同进程之间传递信息或交换信息
进程间通信的目的
数据传输:一个进程需要将它的数据发送给另一个进程
资源共享:多个进程之间共享同样的资源(譬如文件共享)
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件,比如子进程终止时需要通知其父进程
进程控制:有些进程希望完全控制另一个进程的执行(如 Debug进程),此时控制进程希望能够拦截另一个进程的所有异常,并能够及时知道它的状态改变
如何实现进程间通信
由于不同的进程都各自运行在自己的地址空间、这些地址空间相互隔离,一个进程不能直接读取或修改另一个进程的数据(也就是不能直接访问另一个进程的资源),因此不同的进程之间想要实现通信是比较困难的
如果想要实现进程间通信,我们需要借助第三方资源,这个第三方资源其实就是公共资源这个资源不属于任何进程,而是需要进行通信的各个进程之间的公共资源,这些进程都可以去访问这个公共资源,譬如向公共资源写入数据、或者从公共资源读取数据,从而实现进程间通信的目的
因为这个第三方资源是由内核提供,所以进程间通信是需要内核参与的
进程间通信的本质:由OS参与,提供一份所有进程都可以访问的公共资源
公共资源包括:内存块、队列、文件等,所以就出现了多种不同的进程间通信的方法
进程间通信的方法
管道
-
管道是 linux 系统中最古老的一种进程间通信方法,我们把一个进程连接到另一个进程的数据流称为管道!
-
普通管道 pipe:通常有两种限制,一是单工,数据只能单向传输;二是只能在父子或者兄弟进程间使用
-
流管道 s_pipe:去除了普通管道的第一种限制,为半双工,可以双向传输;只能在父子或兄弟进程间使用
-
有名管道 name_pipe(FIFO):去除了普通管道的第二种限制,并且允许在不相关(不是父子或兄弟关系)的进程间进行通讯
- 命名管道是有名字的,所以在进行进程间通信之前,需要创建这个管道文件,命名管道文件存在文件系统中,管道文件有自己的名字,只要对这个管道文件进行读写操作,就可以向管道中写入数据或从管道中读取数据。所以,命名管道可以作为同一台主机上的任意进程之间进行通信
信号
- 信号可以作为进程间的通信手段,譬如用于通知某个进程发生了某事!
内存映射
- 内存映射就是将文件映射到进程的地址空间,然后直接通过读写地址的方式去访问这个文件的内容。适用于多个进程之间的文件共享
消息队列
-
消息队列定义:消息队列是存放在内核中的消息链表,由消息队列标识符标识
-
消息队列的优势:克服了信号传递信息少、管道无格式字节流、缓冲区大小受限等缺陷
-
消息队列类型:包括POSIX消息队列和System V消息队列
-
消息队列在UNIX中的应用:UNIX系统中,不同进程通过消息队列共享资源,允许进程发送格式化数据流给任意进程
-
消息队列操作权限:有足够权限的进程可以向队列添加消息,有读权限的进程可以读取队列中的消息
共享内存
-
共享内存定义:共享内存是映射到多个进程地址空间的一段内存,由一个进程创建,但多个进程可以访问
-
共享内存的优势:作为最快的进程间通信(IPC)方式,专门设计来克服其他IPC方式的效率低下问题
-
共享内存的使用:通常与其他通信机制(如信号量)结合使用,以实现进程间的同步和通信
套接字(Socket)
-
Socket定义:Socket是一种基于网络的进程间通信(IPC)方法,支持同一主机或网络连接的不同主机上的应用程序交换数据
-
Socket在网络通信中的作用:Socket是网络通信的基础
-
客户端/服务器通信流程
-
应用程序创建Socket:每个应用程序创建一个Socket,作为通信的“设备”
-
服务器绑定Socket:服务器将Socket绑定到众所周知的地址,以便客户端能够定位并连接到服务器
-