下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WordLinux下进程间如何实现共享内存通信
这次我们来讲一下(Linux)进程(通信)中重要的通信方式:共享内存作为Linux软件开发攻城狮,进程间通信是必须熟练掌握的重要技能,而共享内存是在程序开发中常用的也是重要的一种进程间通信方式。
下面我们就来聊一聊Linux下进程间如何实现共享内存通信,有哪些方式?
1、基本概念
UNIX和Linux
UNIX和Linux是两种不同的(操作系统),它们的主要区别在以下几个方面:
历史:UNIX是最早的商业化操作系统之一,最初由贝尔实验室开发,而Linux则是由LinusTorvalds于1991年开发的开源操作系统。源代码:UNIX的源代码是私有的,需要购买授权才能使用和修改,而Linux是开源的,任何人都可以自由地访问、使用和修改其源代码。可移植性:由于UNIX的代码是私有的,因此它们在不同的(硬件)平台之间的可移植性较差。而Linux的源代码是开放的,因此它可以在多种硬件平台上运行。发行版:UNIX有多个商业和非商业版本,如Solaris、(AI)X、HP-UX等,每个版本都有自己的特点和功能。而Linux则有许多不同的发行版,如Ubuntu、Debian、RedHat、Fedora等。命令行工具:UNIX和Linux有许多相同的命令行工具和命令,如ls、grep、awk等,但也有一些不同之处。总的来说,UNIX和Linux都是基于UNIX哲学的操作系统,但它们在源代码、可移植性、发行版和命令行工具等方面有所不同。
SystemV和POSIX
SystemV和POSIX是两种不同的操作系统标准,它们的区别在以下几个方面:
历史背景:SystemV最初是由AT">#include#include#include#include#include#defineSHM_SIZE1024//共享内存大小intmain(){intshmid;char*shmaddr;chars8Re(ad)Buf[1024]={0};key_tkey=ftok(".",'s');//获取共享内存标识符if(key==-1){perror("ftok");exit(1);}//创建共享内存区域shmid=shmget(key,SHM_SIZE,IPC_CREAT|0666);if(shmid==-1){perror("shmget");exit(1);}//将共享内存区域附加到进程地址空间中shmaddr=shmat(shmid,NULL,0);if(shmaddr==(char*)-1){perror("shmat");exit(1);}#if1//在共享内存中写入数据strncpy(shmaddr,"Hello,world!",SHM_SIZE);#else//读数据//memcpy(s8ReadBuf,shmaddr,1024);//printf("s8ReadBuf:%s\\n",s8ReadBuf);#endif//分离共享内存区域if(shmdt(shmaddr)==-1){perror("shmdt");exit(1);}return0;}在上面的例程中,我们首先使用ftok()函数生成一个key值作为共享内存的标识符。然后使用shmget()函数创建共享内存区域,shmaddr指向共享内存区域的起始地址。最后使用shmdt()函数分离共享内存区域。
POSIXIPC机制实现共享内存
以下是一个使用POSIXIPC机制实现共享内存的简单例程,它展示了如何创建、映射和解除映射共享内存区域。
#include#include#include#include#include#include#defineSHM_SIZE1024//共享内存大小#defineSHM_NAME"/myshm"//共享内存名称intmain(){intfd;char*shmaddr;chars8ReadBuf[1024]={0};constchar*msg="Hello,world!";//创建共享内存区域fd=shm_open(SHM_NAME,O_CREAT|O_RDWR,0666);if(fd==-1){perror("shm_open");exit(1);}//调整共享内存区域的大小if(ftruncate(fd,SHM_SIZE)==-1){perror("ftruncate");exit(1);}//映射共享内存区域到进程地址空间中shmaddr=mmap(NULL,SHM_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(shmaddr==MAP_FAILED){perror("mmap");exit(1);}#if1//在共享内存中写入数据strncpy(shmaddr,msg,SHM_SIZE);#else//读数据//memcpy(s8ReadBuf,shmaddr,1024);//printf("s8ReadBuf:%s\\n",s8ReadBuf);#endif//解除共享内存区域与进程地址空间的映射关系if(munmap(shmaddr,SHM_SIZE)==-1){perror("munmap");exit(1);}//删除共享内存区域的文件名并释放资源if(shm_unlink(SHM_NAME)==-1){perror("shm_unlink");exit(1);}return0;}在上面的例程中,我们使用shm_open()函数创建一个共享内存区域,然后使用ftruncate()函数调整共享内存区域的大小。接着,我们使用mmap()函数将共享内存区域映射到进程地址空间中,并使用strncpy()函数在共享内存中写入数据。最后,我们使用munmap()函数解除共享
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全国大学生广告艺术大赛作品欣赏
- 《设立粮食仓库的战》课件
- 山东省济宁市邹城市2025届高三第五次模拟考试语文试卷含解析
- 陕西省西安市碑林区铁一中学2025届高考数学三模试卷含解析
- 吉林省汪清县六中2025届高考数学三模试卷含解析
- 测量学基础常识100个知识点
- 2025届四川省会理县第一中学高三冲刺模拟英语试卷含解析
- 甘肃省天水市甘谷县第一中学2025届高三第五次模拟考试英语试卷含解析
- 现代学徒制课题:中国特色学徒制实施现状调查研究(附:研究思路模板、可修改技术路线图)
- 《信使的信号通路》课件
- 个体诊所药品清单
- 国网基建国家电网公司输变电工程结算管理办法
- 深度学习数学案例(课堂PPT)
- 中国地图含省份信息可编辑矢量图
- 卧式钻床液压系统设计课件
- 路政运政交通运输执法人员考试题库
- 水库维修养护工程施工合同协议书范本
- MS培养基及配制注意事项
- 企业技术标准化管理
- 投资学第19章财务分析stu
- 已有输华贸易的国家(地区)及水产品品种目录
评论
0/150
提交评论