七种通信方式为有名管道、无名管道、信号、消息队列、共享内存、信号灯集、套接字。
无名管道:
无名管道是没有名字的管道,是一个特殊的文件。
因为没有名字只能进行亲缘进程之间进行通信,也可以自己和自己进行通信。
无名管道打开会开启两个文件描述符,一个读文件描述符一个写文件描述符。
因为没有名字,不能使用open函数打开,需要使用特殊的api函数pipe()
管道大小为64K
有名管道
有名管道:有名字的管道,是一个特殊的文件(管道文件)类型为P。
因为有名字,所以可以任意进程之间进行通信,只能进行进程之间的通信,不能进行数据的存储。
可以使用open函数打开。
管道的特点:
当管道的读端存在,写管道,有多少写多少,直到写满64K后,在write处阻塞;
当管道的读端不存在,写管道,会造成管道破裂,内核会向用户空间发送一个SIGPIPE的信号,导致进程结束;
当管道的写端存在,读管道,有多少读多少,没有数据,会在read处阻塞;
当管道的写端不存在,读管道,有多少读多少,没有数据,不会在read处阻塞;
信号:
信号是信号是linux内核实现的。
用户可以给某个进程发送信号,一个进程也能给另一个进程发送信号,内核也可以给某个进程发送信号
一个进程收到信号后的操作有三种:默认(一般是杀死进程)、捕获、忽略
以上信号中,只有两个信号既不能被捕获,也不能被忽略(SIGKILL、SIGSTOP)
信号绑定函数signal()、信号发射函数kill()
消息队列:
消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。
多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除。
共享内存:
共享内存是将物理空间的一片区域映射到内核空间,在将映射的内核空间与用户空间的区域进行连接。
共享内存的操作不是一次性的,当共享内存段中的数据被读取后,依然存在
共享内存是所有进程间通信方式中效率最高的,原因是,操作共享内存段时,无需进行用户空间和内核空间的切换
信号灯集:
信号灯集是完成多个进程之间同步问题;
信号灯集中的每一个灯,都控制一个进程
信号灯集中的等的编号都是从0开始
信号灯集中的每个灯都维护了一个value值,当value为0时,处于阻塞状态,等待其他进程将该资源的值加到1。
套接字
套接字是网络通信使用的介质,也是一种特殊的文件
socket也是一个函数,内核提供的函数,用于创建一个套接字,并返回当前套接字的文件描述符
通过套接字文件描述符可以实现多个进程之间的通信,可以通过文件描述符进程进程之间的绑定.