c语言编程基础之IPC共享内存
共享内存(Shared Memory)是最简单的进程间通信方式,它允许多个进程访问相同的内存,一个进程改变其中的数据后,其他的进程都可以看到数据的变化。
共享内存是进程间最快速的通信方式:
`进程共享同一块内存空间。
`访问共享内存和访问私有内存一样快。
`不需要系统调用和内核入口。
`不造成不必要的内存复制。
内核不对共享内存的访问进行同步,因此程序员必须自己提供同步。
使用共享内存:
`某个进程分配内存段。
`使用这个内存段的进程要连接(attach)这个内存段。
`每个进程使用完共享内存段后,要分离(detach)这个内存段。
`在某个地方,必须有一个进程来销毁这个内存段。
Linux的内存模型:
`每个进程的虚拟内存被分为页(page)。
`每个进程维护自己的内存地址到虚拟内存页之间的映射。
`实际的数据存在于进程的内存地址上。
`尽管每个进程有自己的地址空间,多个进程的映射还是可以指向相同的页。
所有的共享内存段的大小,都是Linux内存页大小的整数倍。
Linux的页大小是4KB,不过程序员应该使用getpagesize函数来获得这个值。
分配:shmget
`第一个参数是一个整型的键,用于指定要创建的段。无关的进程可以通过指定同一个键来访问同一段共享内存。
`使用常量IPC_PRIVATE作为第一个参数,可以避免键的冲突。
`第二个参数是分配的段的大小(字节数)。实际分配的字节数会舍弃多余部分到页大小的整数倍。
`第三个参数是位标志,用来表示创建的选项。
``IPC_CREATE:表明要创建新的共享内存空间。
``IPC_EXCL:总是和上一个标志一起使用。如果指定键的共享内存段已经存在,这个标志会导致调用失败;如果没有指定这个标志,调用会返回已经占用这个键的共享内存段。
``模式标志:9个bit的标志,和系统的文件权限使用相同的标志,不过执行标志无效。这些标志定义在<sys/stat.h>中。
`返回值是新创建的或者取得的内存段的标志符(SHMID)。
连接:shmat
`第一个参数是由shmget得到的标志符(SHMID)。
`第二个参数是指向你想要映射到的本进程的地址空间的指针。如果指定NULL,Linux负责选择一个可用的地址。
/*共享内存 打印各种不同类型的数据所存放的位置 */#include <sys/shm.h>#include <sys/ipc.h>#include <sys/types.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>
#define ARRAY_SIZE 4000#define MALLOC_SIZE 10000#define SHM_SIZE 10000#define SHM_MODE 0666 //设置读写权限
char array[ARRAY_SIZE];
main(){ int shmid; char *p,*shmp;
printf("array[] from %lx to %ls \n",(unsigned long)&array[0],(unsigned long)&array[ARRAY_SIZE] ); printf("stack around %lx \n",(unsigned long)&shmid);
if ((p = malloc(MALLOC_SIZE)) == NULL) printf("malloc error! errno=%d\n",errno); printf("malloced from %lx to %lx\n",(unsigned long)p,(unsigned long)p+MALLOC_SIZE);
if((shmid= shmget(IPC_PRIVATE,SHM_SIZE,SHM_MODE)) < 0){ if((shmid = shmget(IPC_PRIVATE,SHM_SIZE,IPC_CREAT|SHM_MODE)) < 0) printf("creat shmget error! error=%d\n",errno); exit(-1); }
/*if((shmid = shmget(IPC_PRIVATE,SHM_SIZE,IPC_CREAT|SHM_MODE)) < 0) printf("shmget error! errno=%d \n",errno);*/ if((shmp = shmat(shmid,0,0)) == (void*) -1) printf("shmat error! errno=%d\n",errno); printf("shared memory attached from %lx to %lx\n",(unsigned long)shmp,(unsigned long)shmp+SHM_SIZE);
if(shmctl(shmid,IPC_RMID,0) < 0) printf("shmctl error! errno=%d\n",errno);
shmdt(shmp); exit(0);}
c语言编程基础之IPC共享内存相关推荐
- c语言职专试题及答案,中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc...
中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc 中等职业学校计算机应用专业C语言编程基础科试卷及答案一.填空(共35分)1.Unix系统诞生于 年,是由 实验室的K和用汇编语言开发成功的 ...
- 嵌入式C语言编程课件,嵌入式系统C语言编程基础PPT课件
<嵌入式系统C语言编程基础PPT课件>由会员分享,可在线阅读,更多相关<嵌入式系统C语言编程基础PPT课件(81页珍藏版)>请在人人文库网上搜索. 1.嵌入式系统C语言编程基础 ...
- Linux基础入门--进程间通信--共享内存
Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内 ...
- c语言从键盘输入千米数,第二章 C语言编程基础.ppt
第二章 C语言编程基础 习题2 P51-7.8.13.14.16 2.4.8break 语句和continue语句 [例2.19] 输出100 - 200 之间不能被3整除的数. P44 2.4.9循 ...
- C语言对p1口取反,单片机c语言编程基础(5页)-原创力文档
单片机的外部结构: 1. DIP40双列直插: 2. P0,P1,P2,P3四个8位准双向I/O引脚:(作为I/O输入时,要先输出高电平) 3. 电源VCC(PIN40)和地线GND(PIN20): ...
- Linux——Linux C语言编程基础知识
源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 通常在gcc后跟一些选项和文件名来使用gcc编译器.gcc 命令的基本用法如下:: gcc [option ...
- r语言编程基础_这项免费的统计编程课程仅需2个小时即可学习R编程语言基础知识
r语言编程基础 Learn the R programming language in this course from Barton Poulson of datalab.cc. This is a ...
- 数据库笔记09:Transact-SQL语言编程基础
/********************************* 第九单元 Transact-SQL语言编程基础 ***********************************/ /* ...
- 51单片机c语言程序控制,51单片机C语言编程基础及实例.pdf
基础知识: 51 单片机编程基础 第一节:单数码管按键显示 第二节:双数码管可调秒表 第三节:十字路口交通灯 第四节:数码管驱动 第五节:键盘驱动 第六节:低频频率计 第七节:电子表 第八节:串行口应 ...
最新文章
- SQL语句对于NUll的筛选
- shell实例第9讲:判断用户输入的是否为IP地址
- 【.NET基础】--委托、事件、线程(2)
- Redis 常用操作命令
- OpenCV视频加速Video acceleration的实例(附完整代码)
- SpringBoot入门到精通_第7篇 _必知必会总结
- django模板层 (标签,过滤器,自定义inclusion_tag,模板的继承与导入)
- Jmeter学习笔记ONE
- java线程同步: synchronized详解(转)
- 你被大数据“杀熟”了么?
- 文本编辑器(Editor)and 文件上传功能
- 在精简版的xp添加删除程序里面没有IIS的解决方法
- [C#/DevExpress]VS2010使用CefSharp调用Chrome内核打开网页
- ubuntu截图保存到剪切板
- java求拼接后的字符串长度,java如何拼接字符串
- 认真学习MySQL的事务日志-Redo日志
- python 混合整数规划_混合整数规划仓库位置(Python+GLPK)
- 莫尔斯码(Morse Code)
- Python转换图像格式,超全
- 【个人经历】22届-cs保研历程
热门文章
- Java【冒泡排序】算法, 大白话式图文解析(附代码)
- 加速度传感器灵敏度的几种表示方式
- 抖音直播弹幕协议解析记录
- 一个简单的swap交换函数
- 19【字节流、字符流】
- Cell Genomics封面|北大吴华君组利用空间多组学技术解析肿瘤内空间异质性(附招聘)...
- Linux内核国内下载地址
- 经典功率谱估计(直接法、间接法、直接法的改进(包括Bartlett法、Welch法))
- Type mismatch Can‘t assign java.math.BigDecimal to java.lang.Double
- python PIL增强或降低图像对比度