在多个进程之间交换数据,在多个进程之间交换数据,最高效的方法莫过于共享内存。

   linux共享内存是通过tmpfs这个文件系统来实现的,tmpfs文件系的目录为/dev/shm,/dev/shm是驻留在内存 RAM 当中的,因此读写速度与读写内存速度一。/dev/shm的容量默认尺寸为系统内存大小的一半大小,使用df -h命令可以看到。

  如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节,仅在使用shm_open文件时,/dev/shm才会真正占用内存。

1. share memory write
# emacs shmopen_write.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>#define MMAP_DATA_SIZE 1024
#define USE_MMAP 1
int main(int argc,char * argv[]){char * data;int fd = shm_open("shm_001", O_CREAT|O_RDWR, 0777);if(fd < 0) {printf("shm_open failed!\n");return -1;}ftruncate(fd, MMAP_DATA_SIZE);if (USE_MMAP) {data = (char*)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if(!data) {printf("mmap failed\n");close(fd);}sprintf(data, "This is a share memory data, use mmap() implement !\n");munmap(data, MMAP_DATA_SIZE);}else{char buf[1024];int len = sprintf(buf,"This is a share memory by write, use write() implement !\n");if (write(fd, buf, len) <= 0) {printf("write file %d failed!%d\n",len,errno);}}close(fd);getchar();shm_unlink("shm_001");return 0;
}# gcc shmopen_write.c -lrt -o write
注意:拿到共享内存"/dev/shm/shm_001"的fd,不管是mmap,或者write,本质都是向fd指向的文件里写东西;如果fd是打开的文件的描述符,就是往文件里写;如果fd是打开共享内存的描述符,就往共享内存里写,和文件的fd一样,拿到这个fd就可以读出来数据。
2、share memory read
# emacs shmopen_read.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>#define MMAP_DATA_SIZE 1024int main(int argc,char * argv[]){char * data;int fd = shm_open("shm_001", O_RDWR, 0777);if(fd < 0){printf("error open shm object\n");return -1;}data = (char*)mmap(NULL, MMAP_DATA_SIZE, PROT_READ, MAP_SHARED, fd, 0);if (!data) {printf("mmap failed!\n");close(fd);return -1;}printf("%s\n",data); munmap(data,MMAP_DATA_SIZE);close(fd);getchar(); return 0;
}# gcc shmopen_read.c -lrt -o read

C语言之共享内存shm_open(二十五)相关推荐

  1. moran指数 r语言_白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(2):不同空间关系对莫兰指数的影响...

    原标题:白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(2):不同空间关系对莫兰指数的影响 上一篇,讲了R语言中的空间权重矩阵的结构,这一节讲讲R语言里面空间权重矩阵的自定义. 与Ar ...

  2. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  3. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  4. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  5. 二十五、求单点的最短路径

    二十五.求单点的最短路径 文章目录 二十五.求单点的最短路径 题目描述 解题思路 上机代码 题目描述 求从指定源点出发到各个顶点的最短路径. **假设:**图中结点名均为单个互不相同的字母,权值均&g ...

  6. Python之精心整理的二十五个文本提取及NLP相关的处理案例

    一.提取 PDF 内容 # pip install PyPDF2 安装 PyPDF2 import PyPDF2 from PyPDF2 import PdfFileReader# Creating ...

  7. SAP UI5 初学者教程之二十五 - 使用代理服务器解决 SAP UI5 应用访问远端 OData 服务的跨域问题试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  8. 【Vue2.0学习】—Vuex工作原理图(二十五)

    [Vue2.0学习]-Vuex工作原理图(二十五) 一. Vuex 是什么? 概念: 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写 ...

  9. 开源操作系统 FreeDOS 二十五年演进史:因微软抛弃 MS-DOS 而来!

    [CSDN 编者按]1994 年,微软宣布停止支持 MS-DOS,而 FreeDOS 的作者 Jim Hall 作为 MS-DOS 的超级粉丝,决定自行设计一个 MS-DOS 的自由软件替代--这就有 ...

最新文章

  1. python生成回文数
  2. 3.10 触发字检测-深度学习第五课《序列模型》-Stanford吴恩达教授
  3. 你的响应阻塞了没有?--Spring-WebFlux源码分析
  4. SpringCloud Netflix Eureka
  5. 有益的CountDownLatch和棘手的Java死锁
  6. java后台获取流_java后台发送请求获取数据,并解析json数据
  7. Linux C基础笔记(1)
  8. 程序员面试金典——11.6矩阵元素查找
  9. django singal 信号量
  10. LCD1602液晶显示设计
  11. 如何防御sql注入?
  12. 基于51单片机的智能温控风扇(程序+仿真+原理图)
  13. 华为服务器MLC硬盘ID号,别被骗了!TLC/MLC SSD寿命测试:意外
  14. mysql的填充因子_数据库SQL Server – 索引 – 填充因子
  15. java基本类型val_Java的基本数据类型
  16. 《23种设计模式之单例模式(4种实现)》
  17. Rabbitmq学习笔记(尚硅谷2021)
  18. 微型计算机简单并行接口实验
  19. 安卓,类QQ评论,界面编写
  20. golang面试题(带答案)

热门文章

  1. 凉凉了,Eureka 宣布闭源,Spring Cloud 何去何从? 1
  2. HDU - 4607 Park Visit (树的直径)
  3. Android内存优化2 了解java内存分配 2
  4. mysql集群环境搭建
  5. SQL Server中CTE的另一种递归方式-从底层向上递归
  6. elasticsearch 随笔
  7. postifx网络服务的搭建和配置
  8. 模板建网站-开源工具
  9. c模拟linux进程管理课程设计,操作系统课程设计(三):Linux进程管理
  10. IEC,ASTM,ISO,DIN,JIS等国际标准网站