进程间通信
1 管道
通信效率低,不适合进程间频繁地交换数据。
分为匿名管道和命名管道
匿名管道,⽤完了就销毁。
命名管道,也被叫做 FIFO。
通信范围
对于匿名管道, 它的通信范围是存在⽗⼦关系的进程。因为管道没有实体,也就是没有管道⽂件,只能通过 fork 来复制⽗进程 fd ⽂件描述符,来达到通信的⽬的。
对于命名管道, 它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了⼀个类型为管道的设备⽂件,在进程⾥只要使⽤这个设备⽂件,就可以相互通信。
不管是匿名管道还是命名管道,进程写⼊的数据都是缓存在内核中,另⼀个进程读取数据时候⾃然也是从内核中获取,同时通信数据都遵循先进先出原则,不⽀持 lseek 之类的⽂件定位操作。
2 消息队列
匿名管道的⽣命周期,是随进程的创建⽽建⽴,随进程的结束⽽销毁。
消息队列⽣命周期随内核,消息队列是保存在内核中的消息链表。
不足之处 3 共享内存
解决了“消息队列”用户态和内核态之间消息拷贝的问题。
4 信号量
如果多个进程同时修改同⼀个共享内存,很有可能就冲突了。
为了防⽌多进程竞争共享资源,⽽造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被⼀个进程访问。正好, 信号量就实现了这⼀保护机制。
信号量其实是⼀个整型的计数器,主要⽤于实现进程间的互斥与同步,⽽不是⽤于缓存进程间通信的数据。
信号量也同样可以在线程间实现互斥与同步:
· 互斥的⽅式,可保证任意时刻只有⼀个线程访问共享资源;
· 同步的⽅式,可保证线程 A 应在线程 B 之前执⾏;
5 信号
信号事件的来源主要有硬件来源(如键盘 Cltr+C )和软件来源(如 kill 命令)
6 Socket
针对TCP协议通信的socket编程模型
两个Socket,一个监听socket,一个已完成连接socket。
针对UDP协议通信的socket编程模型
针对本地进程间通信的 socket 编程模型
7 总结-写的很好