进程间的通信方式
- 管道
- 消息队列
- 共享内存
- 信号量
- 信号
- Socket
管道
管道方式举例: | 就是一个匿名管道将ps aux的输出作为后一个命令的输入,而且很显然管道是单向的。双向通信就需要两个管道。
1 | ps aux | grep mysql |
管道分类
- 匿名管道 | (用完就销毁)
- 命名管道 FIFO (数据是先进先出的形式)
1 | mkfifo myPipe |
myPipe 就是我们创建的管道的名称,linux一切皆文件这个pipe的文件类型是P
1 | song@MateBooke13:~$ ls -l pipe |
往管道写入数据
1 | echo "hello" > pipe //写入数据 |
管道的原理
管道就是内核的一串缓存,从管道的一段写入数据,实际上就是缓存在内核中的,另一端读取也就是从内核中读取这段数据。另外管道传输的数据是无格式的且大小受限。
匿名管道必须在父子进程中进行。而命名管道无此限制 在shell中执行 A|B,A和B都是shell创建的子进程。
缺点
- 管道的通信方式效率很低,不适合在进程间频繁的交换数据。
消息队列
消息队列可以解决管道的缺点。A进程给B发消息,A把数据放到消息队列里面就可以走了。B需要的时候就去取
消息队列是保存在内核中的消息链表,发送前要确认好数据格式。消息队列随内核存在。
缺点
- 通信不及时
- 邮件大小有限制
- 通信过程存在切换内核态开销
共享内存
共享内存是为了解决消息队列存在内核态和用户态切换的问题。
共享内存的机制就是拿出一块虚拟地址,映射到相同的物理内存中,这个对内存的读取另一个进程马上就能看到。