进程通信方式总述
- 无名管道
- 有名管道
- 消息队列
- 共享内存
无名管道 pipe
- 要求两个进程之间有血缘关系,比如 fork 出来的父子进程
- fork, 共享代码空间,但是有各自的数据空间,只不过 fork 出来的子进程的数据空间是赋值父进程的数据空间
- 管道是一个固定大小(4kb)的缓冲区,进程一个堵塞写,一个堵塞读,即数据是单向的
有名管道 fifo
- 无名管道要求父子关系的进程才能使用,局限性有点大
- 有名管道,相当于是一个有名字的文件,所以没有血缘关系的进程可以通过有名管道来通信
- 名字在文件系统上
- 数据在内存中
- 也是堵塞写,堵塞读,单向
消息队列
- linux 的消息队列可以看成一个链表结构
- msgque 链表,节点指针指向 msgid_ds 结构
- 每个消息可以指定类型,消费的时候可以消费指定类型的结构
共享内存
- 一块物理内存映射到两个进程的进程地址空间,进程之间可以立刻看到对方在内存空间做出的修改
- 需要锁保证同步
信号量
- TODO