进程间的通信方式主要有:
-
管道
-
消息队列
-
共享内存
-
信号
-
Socket
管道
管道就是内核中的一段缓存,将数据写入到管道中其实就是将数据缓存到内核中,读取就是从内核中读取这段数据,且管道传输的数据是无格式的流,其大小受限。效率较低,不适合进程间频繁交换数据
-
匿名管道:匿名管道只存在与内存中,通信的数据是无格式的流且大小受限,通信方式是单向的,想要双向通信,就需要创建两个管道,同时,匿名管道是只能用于存在父子关系的进程间通信,随进程的创建而创建,随进程的终止而消失。
-
命名管道:需要在文件系统创建一个类型为P的设备文件,几个毫无关系的进程可以通过这个设备文件通信,但不管是匿名还是命名管道,进程写入的数据都是缓存在内核中,其他线程读取数据也都是从内核中获取,通信数据遵循先进先出原则。
消息队列
消息队列是保存在内核中的消息链表,消息队列的消息体是可以被用户定义的数据类型,发送数据时,会分成一个个独立的消息体,接收数据时,接收方要与发送方发送的消息体数据类型相同,且通信不及时,消息体大小存在限制
-
通信不及时:消息队列通信过程中,存在用户态和内核态之间的数据拷贝开销。因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,接收消息同理。
-
不适合大数据运输:因为在内核中每个消息体都有一个最大长度的限制,同时所有队列所包含的全部消息体的总长度也是有上限。
共享内存
共享内存可以解决消息队列通信中用户态与内核态之间数据拷贝过程带来的开销,它直接分配一个共享空间,每个进程都可以直接访问,是最快的进程间通信方式,但多线程竞争同个共享资源会造成数据错乱。因此,就需要信号量来保护共享资源,确保任何时刻只有一个线程访问共享资源。
信号量
信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。
信号量表示资源的数量,控制信号量的方式有两种原子操作:
-
P操作:将信号量 -1,如果相减后信号量< 0,说明资源被占用,进程阻塞等待,反之说明资源可以使用,进程正常执行
-
V操作:将信号量 +1,如果相加后信号量 <= 0,表明当前有阻塞中的进程,会将该进程唤醒运行,反之则没有
P操作是在进入共享资源前执行的,V操作是在离开共享资源后执行,两个操作成对出现。
信号
作用于异常情况下的工作模式,是一种异步通信进程,一旦信号产生,就有下面几种用户进程对信号的处理方式:
-
执行默认操作
-
捕捉信号。当信号发生时,执行相应的信号处理函数
-
忽略信号:不做任何处理。
Socket
用于跨网络与不同主机上的进程之间通信,也可以在同主机上的进程间通信
有三种通信方式:
-
TCP字节流通信:通过三次握手建立连接,连接后通过 read 和 write 函数读写数据,就像往同一个文件流里写东西一样
-
UDP数据报通信
-
本地进程间通信:绑定一个本地文件,通过这个本地文件通信

被折叠的 条评论
为什么被折叠?



