共享内存的实现分为两步:

1、创建共享内存,用到的函数是shmget();

2、映射共享内存,就是把这段创建的共享内存映射到具体的进程空间去,使用的函数是:shmat();

这样就可以使用不带缓冲的I/O读写命令对其进行操作了。

实例如下:

/** shmem.c**  Created on: 2012-7-20*      Author: liwei.cai*/
/*** 该实例说明:如何使用基本的共享内存函数。* 功能:首先创建一个共享内存区,之后创建子进程,在父子进程中将共享内存* 分别映射到各自的进程地址空间中。*    父进程先等待用户输入,然后将用户输入的字符串写入到共享内存,之* 后往共享内存的头部写入“WROTE”字符串表示父进程已成功写入数据。子进程* 一直等待共享内存的头部字符串是“WROTE”,然后将共享内存的有效数据打印* 出来,之后父子进程分别解除与共享内存的映射。*  最后在子进程中删除共享内存。*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define BUFFER_SIZE 2048int main()
{pid_t pid;int shmid;char *shm_addr;char flag[] = "WROTE";char *buff;//创建共享内存if ((shmid = shmget(IPC_PRIVATE, BUFFER_SIZE, 0666)) < 0){perror("shmget");exit(1);}else{printf("Create shared-memory: %d\n", shmid);}//显示共享内存的情况system("ipcs -m");pid = fork();if (pid == -1){perror("fork");exit(1);}else if (pid == 0) //子进程{// 映射共享内存if ((shm_addr = shmat(shmid, 0, 0)) == (void*)-1){perror("Child: shmat");exit(1);}else{printf("Child:Attach shared-memory: %p\n", shm_addr);}system("ipcs -m");//通过检查在共享内存的头部是否标志字符串“WROTE”来确认//父进程已经此案够共享内存写入有效数据while(strncmp(shm_addr, flag, strlen(flag))){printf("Child: wait for enable data...\n");sleep(5);}//获取共享内存的有效数据并显示strcpy(buff, shm_addr + strlen(flag));printf("Child: Shared-memory: %s\n", buff);//解除共享内存映射if((shmdt(shm_addr)) < 0){perror("shmdt");exit(1);}else{printf("Child: Deattach shared-memory\n");}system("ipcs -m");//删除共享内存if(shmctl(shmid, IPC_RMID, NULL) == -1){perror("Child: shmctl(IPC_RMID)\n");exit(1);}else{printf("Delete shared-memory\n");}system("ipcs -m");}else    //父进程{//映射共享内存if ((shm_addr = shmat(shmid, 0, 0)) == (void*)-1){perror("Parent: shmat");exit(1);}else{printf("Parent:Attach shared-memory: %p\n", shm_addr);}sleep(1);printf("\n Input some string: \n");fgets(buff, BUFFER_SIZE,stdin);strncpy(shm_addr + strlen(flag), buff, strlen(buff));strncpy(shm_addr, flag, strlen(flag));//解除共享内存映射if((shmdt(shm_addr)) < 0){perror("shmdt");exit(1);}else{printf("Parent: Deattach shared-memory\n");}system("ipcs -m");waitpid(pid, NULL, 0);printf("Finished\n");}exit(0);
}

运行调试的时候出现,堆栈错误,请读者仔细阅读和修改代码,找出错误,附在下面。

共享内存的创建和映射shmget()和shmat()相关推荐

  1. SystemV 共享内存(一)—— 共享内存的创建与释放(shmget / shmctl)

    匿名管道和命名管道都是基于文件的进程间通信,SystemV方案是在OS内核层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口 SystemV方案包含三种: ...

  2. 共享内存(一)—— 共享内存的创建与释放

    匿名管道和命名管道都是基于文件的进程间通信,SystemV方案是在OS层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口 SystemV方案包含三种:共享 ...

  3. VC共享内存的创建和权限问题

    最近做的项目中,由用户双击启动的应用创建了共享内存,调用CreateFileMapping,按百度到的方式,发现在PHP以服务启动(运行在SYSTEM用户下)无法访问到该共享内存的内容,数值都是0. ...

  4. nginx使用ngx_shared_memory_add和ngx_slab_alloc等在共享内存里创建一棵红黑树

    nginx是多进程的运行的一个程序,对需要跨进程访问的资源,nginx提供了共享内存上的slab来管理.这里我们实现一个在slab上的红黑树,这里把代码贴出来,对流程的理解都在代码的注释里!! 首先, ...

  5. 高通平台smd分析及smem共享内存的创建笔记

    http://blog.csdn.net/whshiyun/article/details/79447959 转载于:https://www.cnblogs.com/RunnigGift/p/8581 ...

  6. 删除共享内存_进程通信专题之 共享内存

    什么是共享内存呢? 共享内存是被多个进程共享一部分物理内存,共享内存是进程间共享数据最快的办法,因为一个进程向共享内存中写了数据,那么共享的这个区域的所有进程就可以立刻看到这里的数据. 共享内存有什么 ...

  7. mmap映射区和shm共享内存的区别总结

    linux中的两种共享内存.一种是我们的IPC通信System V版本的共享内存,另外的一种就是我们今天提到的存储映射I/O(mmap函数) 在说mmap之前我们先说一下普通的读写文件的原理,进程调用 ...

  8. linux ipc shmget 例子,Linux IPC之共享内存C 事例(示例代码)

    简介 共享内存(shared memory)是最简单的Linux进程间通信方式之一.使用共享内存,不同进程可以对同一块内存进行读写.由于所有进程对共享内存的访问就和访问自己的内存空间一样,而不需要进行 ...

  9. shmget - 共享内存

    一. 共享内存介绍 系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的 进程都必须在本进程的地址空间新增一块内存区域,用来映射 ...

最新文章

  1. Android 自定义View的使用纪要!!!
  2. 点号与冒号操作符的区别
  3. 词嵌入应用_神经词嵌入的法律应用
  4. 【今日CV 视觉论文速览】05 Dec 2018
  5. 【Java】利用递归求阶乘
  6. 【python零基础入门学习】Python入门,带你快速学习,Python 中文编码
  7. Android性能优化:手把手带你全面实现内存优化
  8. 2008年全国计算机等级考试须知及参考资料
  9. VS2015+OpenCV3.4.2+Win10+简单调用摄像头
  10. spring awre的理解
  11. Spring整合MyBatis源码
  12. 基于DFA算法的敏感词过滤的go语言实现
  13. [从零开始学习FPGA编程-58]:集成电路设计的运作模式(Fabless/Foundry/IDM模式)
  14. Kerberos安装及使用2(Kerberos服务器KDC安装及配置)
  15. ps5下载队列错误怎么办?索尼提供解决PS5下载bug的方法
  16. pringboot餐饮点餐系统毕业设计源码301749
  17. 直线插补c语言源程序,老哥们求助直线插补程序,带图我不会图啊
  18. 游戏中的语音聊天方案
  19. Windows 10开启ISS Web服务
  20. vue八角云台控制组件萤石云less

热门文章

  1. 模拟电子技术200问
  2. STM32操作OLED显示屏
  3. 模块电路选型(2)----主控模块
  4. nsq.reader错误connection closed
  5. uniapp商城前端源码下载/uniapp多店铺PHP商城源码下载
  6. HR SaaS系统,虎蔓开创云端人力资源管理的领先新模式!
  7. java基础(部分)
  8. 我不是药神,救不了你的穷根
  9. 设计模式——管道模式(并发模式)
  10. nodejs express搭建服务器(爬虫知乎精华帖,个人学习用)一 爬取所有话题类型