Linux共享内存

  • 一、基本概念
  • 二、常用函数
    • 1. shm_open
    • 2. mmap
    • 3. munmap
    • 4. shm_unlink
    • 5. ftruncate
  • 三、使用示例
  • 四、share内存不足解决方法

一、基本概念

linux下,每个进程都有自己拥有的内存区域,进程的内存总是私有的。共享内存是从系统的空闲内存池中分配的,希望访问它的每个进程连接它。这个连接过程称为映射。映射后,每个进程都可通过访问自己的内存而访问共享内存区域,从而与其他进程进行通信。

二、常用函数

1. shm_open

// 用于创建或者打开共享内存文件,linux系统默认存放目录位/dev/shm
int shm_open(const char *name, int oflag, mode_t mode);name: 共享文件名
oflag: 打开文件的操作属性,O_CREAT、O_RDWR、O_EXCL的按位或运算组合
mode: 文件共享模式,如0777返回值: 成功返回fd>0,  失败返回fd<0

2. mmap

// 将打开的文件映射到内存,从而可以用操作内存指针的方式来操作文件数据
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);addr: 要将文件映射到内存中的地址,一般为NULL,由Linux内核来指定
length: 需要映射文件数据的长度
prot: 映射内存区域的操作权限,包括PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE
flags: 标志位参数,包括:MAP_SHARED、MAP_PRIVATE与MAP_ANONYMOUS。 MAP_SHARED: 建立共享,用于进程间通信,如果没有这个标志,则别的进程即使能打开文件,也看不到数据。MAP_PRIVATE: 只有进程自己用的内存区域MAP_ANONYMOUS:匿名映射区
fd: 建立映射区的文件描述符,shm_open或者open打开的文件
offset: 映射文件相对于文件头的偏移位置,应该按4096字节对齐返回值:成功返回映射的内存地址指针,可以用这个地址指针对映射的文件内容进行读写操作,读写文件数据如同操作内存一样;如果 失败则返回NULL。

3. munmap

// 取消内存映射,将映射的内存从进程地址空间撤销;不调用,在进程终止之前无法释放该内存区域
int munmap(void *addr, size_t length);addr: 由mmap成功返回的地址
length: 要取消的内存长度

4. shm_unlink

// 删除有shm_open或者open打开的共享文件,在/dev/shm路径下
int shm_unlink(const char *name);name: 共享文件名

5. ftruncate

// 重置文件大小
int ftruncate(int fd, off_t length);fd:shm_open返回打开的文件描述符
length:重置大小

三、使用示例

writer.c函数实现,往/dev/shm目录文件写数据

#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 1struct shm_data
{int start;int end;char name[256];
};int main(int argc,char * argv[])
{struct shm_data* data;int fd = shm_open("shm-file0001", O_CREAT|O_RDWR, 0777);if (fd < 0) {printf("shm_open failed!\n");return -1;}printf("writer fd is %d\n", fd);ftruncate(fd, MMAP_DATA_SIZE);if (USE_MMAP) {data = (struct shm_data*)mmap(NULL, sizeof(struct shm_data), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if (!data) {printf("mmap failed\n");close(fd);}printf("writer data addr is %d\n", data);printf("before, shm data start is %d\n", data->start);data->start = 101;data->end = 10000001;printf("after, shm start is %d, end is %d\n", data->start, data->end);sprintf(data->name, "This is a share memory! %d\n", fd);munmap(data, MMAP_DATA_SIZE);}else {char buf[1024];int len = sprintf(buf,"This is a share memory by write! ! %d\n",fd);if (write(fd, buf, len) <= 0) {printf("write file %d failed!%d\n",len,errno);}  }close(fd);getchar();shm_unlink("shm-file0001");return 0;
}

reader.c函数实现,从/dev/shm目录文件写数据

#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>struct shm_data
{int start;int end;char name[256];
};#define MMAP_DATA_SIZE 1024int main(int argc,char * argv[])
{struct shm_data* data;int fd = shm_open("shm-file0001", O_RDWR, 0777);if(fd < 0){printf("error open shm object\n");return -1;}data = (struct shm_data*)mmap(NULL, MMAP_DATA_SIZE, PROT_READ, MAP_SHARED, fd, 0);if (!data) {printf("mmap failed!\n");close(fd);return -1;}printf(data->name);munmap(data,MMAP_DATA_SIZE);close(fd);getchar();return 0;
}

四、share内存不足解决方法

# 查看大小
df -h /dev/shm# 系统默认大小修改
sudo vim /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=8192M 0 0# 刷新/etc/fstab的内容
mount -a # 查看挂载点
cat /etc/mtab | grep /dev/shm
mount -l | grep /dev/shm# 临时修改
sudo mount -o remount,size=8192M /dev/shm

【Linux共享内存】相关推荐

  1. linux的共享内存,linux共享内存实际在哪里?

    我只想知道共享内存驻留在Linux系统中的位置?它在物理内存还是虚拟内存中?linux共享内存实际在哪里? 我知道有关进程的虚拟内存发送信箱,他们从不同的工艺处理和流程没有看到对方的记忆,但我们可以利 ...

  2. Linux共享内存(二)

    Linux共享内存编程实例 原文链接:http://blog.csdn.net/pcliuguangtao/article/details/6526119 /*共享内存允许两个或多个进程进程共享同一块 ...

  3. c++ 共享内存_关于Linux共享内存的实验 [二] - 原因

    关于Linux共享内存的实验 [一] 上文采用的"删文件"和"杀进程"的方法主要是为了快速演示实验现象,但这种做法不利于通过调试手段进一步探究其内在的逻辑.为此 ...

  4. linux 共享内存操作(shm_open、mmap、编译链接库:-lz -lrt -lm -lc都是什么库)

    文章目录 linux 共享内存操作(shm_open) 一.背景 二.函数使用说明 shm_open ftruncate(改变文件大小) mmap共享内存 三.示例代码 创建内存共享文件并写入数据 打 ...

  5. linux 共享内存 查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

  6. Linux共享内存编程实例

    /*共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间)从而使得这些进程可以相互通信.在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接 ...

  7. LINUX共享内存使用常见陷阱与分析(转)

    所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段共 ...

  8. linux 共享内存_盘点那些linux 后台开发类常见问题及知识点

    一.linux和os: netstat :显示网络状态 tcpdump:主要是截获通过本机网络接口的数据,用以分析.能够截获当前所有通过本机网卡的数据包.它拥有灵活的过滤机制,可以确保得到想要的数据. ...

  9. linux 共享内存_什么是物理/虚拟/共享内存——Linux内存管理小结一

    物理内存和虚拟内存到底有什么区别? 提到内存,我们会想到经常接触的三个词:虚拟内存.物理内存.共享内存.它们分别对应top输出中的VIRT.RES.SHR三列. 1. 物理内存 系统的物理内存被划分为 ...

最新文章

  1. HTML5标签学习之~~~
  2. java工程师的工作时间_Java 工程师真的每天只需工作四小时吗?
  3. (找水王)编程思维训练
  4. CodeForces - 1368E Ski Accidents(拓扑排序)
  5. 作者:宋长青,山东农业大学教授,农业大数据研究中心常务副主任。
  6. Chrome和Firefox浏览器长截图
  7. SWIFT4.0学习01 - 函数的命名、调用以及注意事项
  8. 多目标跟踪数据集 :mot16、mot17数据集介绍
  9. 安卓系统修改开机LOGO
  10. HTML5基础学习-表格标签
  11. [原创] IE中的图片显示不出来
  12. 背单词App开发日记2
  13. C语言 计算BMI值,建议体重
  14. 计算机一级幻灯片版式,ppt2010官方基础教程:添加不同版式幻灯片-powerpoint技巧-电脑技巧收藏家...
  15. java俄罗斯方块七中图形类_shell脚本编写的俄罗斯方块游戏代码
  16. 【Linux】粘包问题
  17. Mac环境配置SSH Key
  18. 数据库如何修改编码格式?
  19. DCT变换和DFT变换
  20. 【Allen方差】计算allen方差

热门文章

  1. pycharm新建项目环境设置详解
  2. 今时不同往日:VS2010十大绝技让VS6叹“.NET研究”服
  3. 目前互联网比较赚钱的项目
  4. React16、17、18版本新特性
  5. GD32F4xx 以太网芯片(enc28j60)驱动移植
  6. 送书 | 《从零开始学Selenium自动化测试》
  7. Vue Element Admin 用mock模块模拟数据
  8. 【图解】九张图带你读懂大数据医疗
  9. mysqladmin - 管理 MySQL 服务器、获取运行状态
  10. 04.reactive