共享内存(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共享内存相关推荐

  1. c语言职专试题及答案,中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc...

    中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc 中等职业学校计算机应用专业C语言编程基础科试卷及答案一.填空(共35分)1.Unix系统诞生于 年,是由 实验室的K和用汇编语言开发成功的 ...

  2. 嵌入式C语言编程课件,嵌入式系统C语言编程基础PPT课件

    <嵌入式系统C语言编程基础PPT课件>由会员分享,可在线阅读,更多相关<嵌入式系统C语言编程基础PPT课件(81页珍藏版)>请在人人文库网上搜索. 1.嵌入式系统C语言编程基础 ...

  3. Linux基础入门--进程间通信--共享内存

    Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内 ...

  4. c语言从键盘输入千米数,第二章 C语言编程基础.ppt

    第二章 C语言编程基础 习题2 P51-7.8.13.14.16 2.4.8break 语句和continue语句 [例2.19] 输出100 - 200 之间不能被3整除的数. P44 2.4.9循 ...

  5. C语言对p1口取反,单片机c语言编程基础(5页)-原创力文档

    单片机的外部结构: 1. DIP40双列直插: 2. P0,P1,P2,P3四个8位准双向I/O引脚:(作为I/O输入时,要先输出高电平) 3. 电源VCC(PIN40)和地线GND(PIN20): ...

  6. Linux——Linux C语言编程基础知识

    源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 通常在gcc后跟一些选项和文件名来使用gcc编译器.gcc 命令的基本用法如下:: gcc [option ...

  7. r语言编程基础_这项免费的统计编程课程仅需2个小时即可学习R编程语言基础知识

    r语言编程基础 Learn the R programming language in this course from Barton Poulson of datalab.cc. This is a ...

  8. 数据库笔记09:Transact-SQL语言编程基础

    /*********************************  第九单元 Transact-SQL语言编程基础 ***********************************/ /* ...

  9. 51单片机c语言程序控制,51单片机C语言编程基础及实例.pdf

    基础知识: 51 单片机编程基础 第一节:单数码管按键显示 第二节:双数码管可调秒表 第三节:十字路口交通灯 第四节:数码管驱动 第五节:键盘驱动 第六节:低频频率计 第七节:电子表 第八节:串行口应 ...

最新文章

  1. SQL语句对于NUll的筛选
  2. shell实例第9讲:判断用户输入的是否为IP地址
  3. 【.NET基础】--委托、事件、线程(2)
  4. Redis 常用操作命令
  5. OpenCV视频加速Video acceleration的实例(附完整代码)
  6. SpringBoot入门到精通_第7篇 _必知必会总结
  7. django模板层 (标签,过滤器,自定义inclusion_tag,模板的继承与导入)
  8. Jmeter学习笔记ONE
  9. java线程同步: synchronized详解(转)
  10. 你被大数据“杀熟”了么?
  11. 文本编辑器(Editor)and 文件上传功能
  12. 在精简版的xp添加删除程序里面没有IIS的解决方法
  13. [C#/DevExpress]VS2010使用CefSharp调用Chrome内核打开网页
  14. ubuntu截图保存到剪切板
  15. java求拼接后的字符串长度,java如何拼接字符串
  16. 认真学习MySQL的事务日志-Redo日志
  17. python 混合整数规划_混合整数规划仓库位置(Python+GLPK)
  18. 莫尔斯码(Morse Code)
  19. Python转换图像格式,超全
  20. 【个人经历】22届-cs保研历程

热门文章

  1. Java【冒泡排序】算法, 大白话式图文解析(附代码)
  2. 加速度传感器灵敏度的几种表示方式
  3. 抖音直播弹幕协议解析记录
  4. 一个简单的swap交换函数
  5. 19【字节流、字符流】
  6. Cell Genomics封面|北大吴华君组利用空间多组学技术解析肿瘤内空间异质性(附招聘)...
  7. Linux内核国内下载地址
  8. 经典功率谱估计(直接法、间接法、直接法的改进(包括Bartlett法、Welch法))
  9. Type mismatch Can‘t assign java.math.BigDecimal to java.lang.Double
  10. python PIL增强或降低图像对比度