进程间通信的7种方式以及优点

七种通信方式为有名管道、无名管道、信号、消息队列、共享内存、信号灯集、套接字。

无名管道:

        无名管道是没有名字的管道,是一个特殊的文件。

        因为没有名字只能进行亲缘进程之间进行通信,也可以自己和自己进行通信。

        无名管道打开会开启两个文件描述符,一个读文件描述符一个写文件描述符。

        因为没有名字,不能使用open函数打开,需要使用特殊的api函数pipe()

        管道大小为64K

有名管道

        有名管道:有名字的管道,是一个特殊的文件(管道文件)类型为P。        

        因为有名字,所以可以任意进程之间进行通信,只能进行进程之间的通信,不能进行数据的存储。

        可以使用open函数打开。

管道的特点:

当管道的读端存在,写管道,有多少写多少,直到写满64K后,在write处阻塞;

当管道的读端不存在,写管道,会造成管道破裂,内核会向用户空间发送一个SIGPIPE的信号,导致进程结束;

当管道的写端存在,读管道,有多少读多少,没有数据,会在read处阻塞;

当管道的写端不存在,读管道,有多少读多少,没有数据,不会在read处阻塞;

信号:

        信号是信号是linux内核实现的。

        用户可以给某个进程发送信号,一个进程也能给另一个进程发送信号,内核也可以给某个进程发送信号

        一个进程收到信号后的操作有三种:默认(一般是杀死进程)、捕获、忽略

        进程间通信的7种方式以及优点_第1张图片

        进程间通信的7种方式以及优点_第2张图片

        以上信号中,只有两个信号既不能被捕获,也不能被忽略(SIGKILL、SIGSTOP)

        信号绑定函数signal()、信号发射函数kill()

消息队列:

消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。

多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除。

共享内存:

        共享内存是将物理空间的一片区域映射到内核空间,在将映射的内核空间与用户空间的区域进行连接。

        共享内存的操作不是一次性的,当共享内存段中的数据被读取后,依然存在

        共享内存是所有进程间通信方式中效率最高的,原因是,操作共享内存段时,无需进行用户空间和内核空间的切换

信号灯集:

信号灯集是完成多个进程之间同步问题;

信号灯集中的每一个灯,都控制一个进程

信号灯集中的等的编号都是从0开始

信号灯集中的每个灯都维护了一个value值,当value为0时,处于阻塞状态,等待其他进程将该资源的值加到1。

套接字

套接字是网络通信使用的介质,也是一种特殊的文件

socket也是一个函数,内核提供的函数,用于创建一个套接字,并返回当前套接字的文件描述符

通过套接字文件描述符可以实现多个进程之间的通信,可以通过文件描述符进程进程之间的绑定.

你可能感兴趣的:(网络)