只说相关函数和理论 具体实现建议自行尝试或者详细文章 这里推荐下”一只大喵咪1201“
共享内存
最快的通信方式(无需进入内核进行系统调用 不需要内核态与用户态之间的数据拷贝)
传递方式:内存中的共享内存空间 通过自身的物理地址 经页表映射到 双方进程的虚拟地址 然后二者就建立链接了
真正释放:只有映射为零才会真正删除但不会释放这块空间 生命周期随内核(重启释放)
创建:
引子:不止一口锅,吃这口锅里饭的有多少人,这口锅是哪部分人的,这伙人之前有没有锅,这口锅给没给过去
shmget创建共享内存 设置key进行标识 ftok生成key防止重复 size表示大小
标志位有三种方式
IPC_CREAT:不存在 创建 存在 获取相关信息
IPC_EXCL:无法单独使用 必须与其他标志组合使用
IPC_CREAT | IPC_EXCL:不存在 创建 存在 错误返回(使用率高)
生命周期:随内核 不随进程
删除共享内存:ipcrm -m shimd(命令 手动)shmctl(函数 自动)
链接:shmat 链接 shmdt 断链
消息队列(了解)
简述:一方把不同的通信内容一块块以队列的方式排好 另一方从队头一个接一个慢慢找(队头可跳)很随意 不是严格的先进先出
常用共享内存 消息队列的函数不想细说啦😝
信号量(了解)
这里先了解临界资源 临界区 共享资源 共享区
临界资源和共享资源的区别在于是否可重入 就是多个进程一起访问 临界资源不可
临界区 访问临界资源的代码的区域 共享区就是hhhhh没有共享区这个名词
信号量就是资源计数器 表示现在还有多少资源
有人拿掉一个减一(p操作) 访问完释放后加一(v操作)
防止大家一起上来抢的局面 就必须排好队 所以pv操作具有原子性(一次性做完任务 不可以中止) 和阻塞操作