[C++]Linux之进程间通信小结【待完善】
【此博文,待日后完善】
进程通信方式:
1.管道通信(匿名管道/命名管道)
2.消息队列
3.共享内存
4.信号量
1.管道通信
无名管道用于具有亲缘关系进程间的通信
管道是半双工的,数据只能单向流动(双方通信需建立两个管道)
管道只能用于父子进程或兄弟进程之间
管道对于管道两端的进程而言就是一个文件,并单独构成一种文件系统,存在于内存中
写管道的内容添加在管道缓冲区的末尾,读管道则从缓冲区头部读出有名管道在普通管道具备功能基础上,通过给管道命名的方法变成管道文件,允许无亲缘关系进程间通过访问管道文件进行通信
2.消息队列
也叫报文队列,是消息的链接表
有两种类型的消息队列:POSIX消息队列和系统V消息队列
运行于同一台机器上的进程间通信,与管道类似
可以用流管道或套接口方式取代
系统V消息队列
int msgget( ); 创建一个新队列或打开一个存在的队列
int msgsnd( ); 把消息添加到msgid代表的消息队列的末尾,消息的大小由msgsz指定。
int msgrcv( ); 从msgid代表的消息队列中取走一个消息。
int msgctl( ); 在由msgid标识的消息队列上执行cmd指定的操作。
3.共享内存
将同一块内存区映射到共享它的不同进程的地址空间中
效率高:进程可以直接读写内存,不需任何数据拷贝,避免了内核空间与用户空间的切换
内核未对共享内存的访问提供同步机制,需要依靠某种同步机制来同步对共享进程的访问
POSIX共享内存
通过用户空间挂载的tmpfs文件系统实现,持久化的
API:shm_open( )、mmap( )、munmap( )、shm_unlink( )等
System V共享内存
由内核本身的tmpfs实现,非持久化的
API:shmget( )、shmat( )、shmdt( )、shmctl( )等
4.信号量
也称信号灯,用来协调不同进程间的数据对象
提供对进程间共享资源访问控制的手段,用来保护共享资源
还可用于进程间及同一进程不同线程间的进程同步
两种类型
二值信号灯:取值只能为0或1,类似于互斥锁
计算信号灯:取值可以为任意非负值(受内核本身约束)
POSIX信号量和System V信号量(与共享内存的两种方式类似)
5.参考文献:
[Linux进程间通信——使用命名管道](http://blog.csdn.net/ljianhui/article/details/10202699) 【命名管道讲解得非常有条理性】

本文链接: https://www.cnblogs.com/johnnyzen/p/8029300.html
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析