Linux进程间通信(下)
目录
共享内存
共享内存原理
共享内存接口
1.shmget
2.shmat
3.shmdt
4.shmid
代码验证
共享内存特性
消息队列
消息队列原理
消息队列接口
1.msgget
2.msgsnd
3.msgrcv
4.msgctl
代码验证
信号量
共享内存
共享内存原理
1.在物理内存中开辟一段空间
2.不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间中
3.不同的进程通过操作自己进程虚拟地址空间中的虚拟地址,来操作共享内存
如下图所示:
共享内存接口
1.shmget
功能:创建或获取共享内存,具体用法如下:
2.shmat
功能:将共享内存添加到进程虚拟地址空间,用法如下:
3.shmdt
功能:分离共享内存
4.shmid
功能:获取或者修改共享内存属性信息,以及删除共享内存。
代码验证
给出两端代码,左侧代码的功能是创建共享内存,并往共享内存中写。右侧代码的功能是获取共享内存,并从共享内存中将内容读出来。如下图所示:
打印出来结果,说明使用共享内存进行进程间通信成功。
共享内存特性
1.共享内存生命周期跟随操作系统。在以上的代码中,我们创建了标识符为:"0x34343434"的共享内存,通过命令:"ipcs",可以查看共享内存,如下,此时附加共享内存的进程数量为0,但是共享内存依然存在。
2.共享内存是覆盖写的,读的时候,访问的是地址。
3.共享内存的删除特性
共享内存可以使用函数或者命令来删除,如下代码中使用函数删除共享内存:
1 #include <stdio.h>2 #include <sys/shm.h>3 #include <unistd.h>4 int main(){5 int shm_id=shmget(0x56565656,1024,IPC_CREAT|0664);6 if(shm_id<0){7 perror("shmget");8 return 0;9 }10 int count=20;11 while(count){//睡眠20秒 12 sleep(1);13 count--;14 }15 shmctl(shm_id,IPC_RMID,NULL);16 return 0;17 }
编译运行后:
根据以上现象,成功使用函数删除了共享内存。
使用命令"ipcrm -m [共享内存操作句柄]"也可以删除共享内存:
删除特性:
消息队列
消息队列原理
1、消息队列采用链表来实现,该链表由系统内核来维护
2、系统中可能会有很多的消息队列,每个消息队列用消息队列描述符(消息队列id - qid)来区分,qid是唯一的,用来区分不同的消息队列。
3、在进行进程间通信的时候,一个进程将消息追加到消息队列的尾端,另一个进程从消息队列里取数据(不一定按照先进先出的原则取数据,也可以按照消息类型字段来取)。
消息队列接口
1.msgget
功能:创建消息队列
2.msgsnd
功能:发送消息
3.msgrcv
功能:接收消息
4.msgctl
功能:操作消息队列
代码验证
以下代码中,左边代码创建消息队列,并且往消息队列中发送消息,右边代码获取消息队列,并且从消息队列读出消息。观察运行结果,进程间通信成功。
另外,删除消息队列可用命令"ipcrm -q [msqid]"进行删除。
信号量
4.信号量本质是资源计数器,能够保证多个进程访问临界资源,执行临界区代码的时候,互斥访问,同时也可以用于同步。
如何保证?
通过信号量的值来保证,每个进程需要先获取信号量,只有获取到信号量才可以访问临界资源,如果获取失败,则阻塞等待,同步是指临界资源空闲之后,通知等待的进程进行访问。
Linux进程间通信(下)相关推荐
- linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- Linux系统下的进程间通信(IPC)
Linux系统下的进程间通信(IPC) 进程间通信作用: 通信方式: 一.早期unix系统的ipc 1.匿名管道(pipe) 2.命名管道(fifo) 3.信号 二.Sytem -V ipc Syst ...
- linux进程间通信:POSIX 消息队列
文章目录 基本介绍 相关编程接口 编程实例 消息队列通信实例 消息队列属性设置实例 基本介绍 关于消息队列的基本介绍,前面在学习system V的消息队列时已经有过了解,linux进程间通信:syst ...
- linux+Qt 下利用D-Bus进行进程间高效通信的三种方式
linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
- 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结
20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...
- Linux 进程间通信
引言 进程通信的目的: 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一 ...
- Linux进程间通信中的文件和文件锁
Linux进程间通信中的文件和文件锁 来源:穷佐罗的Linux书 前言 使用文件进行进程间通信应该是最先学会的一种IPC方式.任何编程语言中,文件IO都是很重要的知识,所以使用文件进行进程间通信就成了 ...
- linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
最新文章
- Visual Studio中11个强大的调试技巧和方法
- SVN 命令行进行忽略设置
- JAVA Swing——设置JButton按钮样式
- boost::mpl::abs相关的测试程序
- wireMock快速伪造restful服务
- [Tools] JD-GUI(Java Decompiler)
- VL53L0x TOF激光测距的 stm32 HAL库驱动代码
- 用代码排出自己的名字
- webpack手动构建vue和vue-cli构建使用 px2rem-loader ,全局自动转换px单位,让自适应来的更简单点!...
- 5G手机的赛点争夺战
- 笔记本电脑光驱位置装固态硬盘流程
- Unity Shader-Phong光照模型与Specular
- 公认最好的鸿蒙系统,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可
!【手机吧】_百度贴吧...
- 新计算机如何用光盘安装系统,win7如何用光盘装系统_使用光盘重装win7系统步骤...
- linux 解压参数 zxvf,在linux下面解压用的zxpf是什么意思,它跟zxvf有啥区别
- 第五章(3)行逻辑链接的顺序表
- 微信无法显示好友头像
- 校园网及入网计算机管理制度,校园网用户入网管理规定
- 全网营销优势在于打造营销闭环,全网营销的经典营销方式推荐
- 解析S2B2C模式的典型特征,应用S2B2C商城助力医疗器械企业快速发展