Linux系统编程 —共享内存之mmap
共享内存概念
共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备。但是它没有自带同步机制,需要配合信号量等方式来进行同步。
共享内存被创建以后,同一块物理内存被映射到了多个进程地址空间,当有一个进程修改了共享内存的数据,其余的进程均可看见所修改的内容,反之亦然。

mmap函数
函数原型:
void *mmap(void *adrr, size_t length, int prot, int flags, int fd, off_t offset);
返回值:
成功:返回创建的映射区首地址;
失败:返回MAP_FAILED
具体参数含义:
addr:指向映射区的首地址,这是由系统内核所决定的,一般设为NULL;
length:欲创建的映射区大小;
prot:映射区的权限,一般有如下几种:
PROT_EXEC 映射区域可被执行
PROT_READ 映射区域可被读取
PROT_WRITE 映射区域可被写入
PROT_NONE 映射区域不能存取
flags:指映射区的标志位,MAP_FIXED与MAP_PRIVATE必须选择一个:
MAP_FIXED:对映射区所作的修改会反映到物理设备,但需要调用msync()或者munmap();
MAP_PRIVATE:对映射区所作的修改不会反映到物理设备。
fd:创建的映射区的文件描述符;
offset:被映射文件的偏移量,一般设为0,表示从头开始映射。
mumap函数
函数原型:
int munmap(void *addr, size_t length);
函数作用:
如同malloc之后需要free一样,mmap调用创建的映射区使用完毕之后,需要调用munmap去释放。
例程
写进程:
1#include <stdio.h>
2#include <sys/mman.h>
3#include <sys/types.h>
4#include <sys/stat.h>
5#include <fcntl.h>
6#include <unistd.h>
7#include <string.h>
8
9typedef struct
10{
11 int id;
12 char name[20];
13 char gender;
14}stu;
15
16int main(int argc, char *argv[])
17{
18 stu *p = NULL;
19 int fd = 0;
20 stu student = {10, "harry", 'm'};
21
22 if (argc < 2) {
23 printf("useage: ./a.out file\n");
24 return -1;
25 }
26
27 fd = open(argv[1], O_RDWR | O_CREAT, 0664);
28 if (fd == -1) {
29 printf("ERROR: open failed!\n");
30 return -1;
31 }
32 ftruncate(fd, sizeof(stu));
33
34 p = mmap(NULL, sizeof(stu), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
35 if (p == MAP_FAILED) {
36 printf("ERROR: mmap failed!\n");
37 return -1;
38 }
39
40 close(fd);
41
42 while (1) {
43 memcpy(p, &student, sizeof(stu));
44 student.id++;
45 sleep(2);
46 }
47 munmap(p, sizeof(stu));
48
49 return 0;
50}
读进程:
1#include <stdio.h>
2#include <sys/mman.h>
3#include <sys/types.h>
4#include <sys/stat.h>
5#include <fcntl.h>
6#include <unistd.h>
7
8typedef struct
9{
10 int id;
11 char name[20];
12 char gender;
13}stu;
14
15int main(int argc, char *argv[])
16{
17 stu *p = NULL;
18 int fd = 0;
19
20 if (argc < 2) {
21 printf("useage: ./a.out file\n");
22 return -1;
23 }
24
25 fd = open(argv[1], O_RDONLY);
26 if (fd == -1) {
27 printf("ERROR: open failed!\n");
28 return -1;
29 }
30
31 p = mmap(NULL, sizeof(stu), PROT_READ, MAP_SHARED, fd, 0);
32 if (p == MAP_FAILED) {
33 printf("ERROR: mmap failed!\n");
34 return -1;
35 }
36
37 close(fd);
38
39 while (1) {
40 printf("id = %d, name = %s, gender = %c\n", p->id, p->name, p->gender);
41 sleep(2);
42 }
43
44 munmap(p, sizeof(stu));
45
46 return 0;
47}
更多精彩内容,请关注公众号良许Linux,公众内回复1024可免费获得5T技术资料,包括:Linux,C/C++,Python,树莓派,嵌入式,Java,人工智能,等等。公众号内回复进群,邀请您进高手如云技术交流群。
公众号:良许Linux

有收获?希望老铁们来个三连击,给更多的人看到这篇文章
Linux系统编程 —共享内存之mmap的更多相关文章
- <转>linux操作系统编程——共享内存读写(采用信号量进行同步互斥)
http://blog.csdn.net/yanghaoran321/article/details/7872722 程序要求: 创建一个写端和一个读端,写端写入数据后读端才开始读,读端读完数据后,写 ...
- 读书笔记之Linux系统编程与深入理解Linux内核
前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...
- Linux系统编程【转】
转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...
- linux系统编程(一)概述
glibc库封装了linux系统调用,并提供c语言接口 所以学习linux系统编程,主要参考glibc库系统调用相关api 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 ...
- Linux 系统编程 学习:04-进程间通信2:System V IPC(1)
Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...
- Linux 系统编程 学习:09-线程:线程的创建、回收与取消
Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...
- Linux系统编程温故知新系列 --- 01
1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- Linux 系统编程
简介和主要概念 Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别. 系统编程分为:驱动编程.用户空间编程和网络编程 ...
随机推荐
- APICloud数据云3.0 -- 让后端业务更简单
近年来,各类移动端应用层出不穷,app.小程序已成为企业业务数字化的必然选择,围绕互联网产品的技术创新与开发者生态,正在历经行业发展的又一次革新. APICloud作为国内领先的移动应用开发平台,一直 ...
- oeasy教您玩转linux010105详细手册man
详细手册 回忆上节课 我们上节课学习了使用命令来了解命令 whatis 我们通过他来发出灵魂之问 whatis到底是干什么的?
- [WUST-CTF]Web WriteUp
周末放假忙里偷闲打了两场比赛,其中一场就是武汉科技大学的WUST-CTF新生赛,虽说是新生赛,题目质量还是相当不错的.最后有幸拿了总排第5,记录一下Web的题解. checkin 进入题目询问题目作者 ...
- 最强 Java 书单推荐,附学习方法
技术大佬用1w+字来告诉你该读什么书,循序渐进,并提供百度云盘下载地址.重要的是还有学习方法. 请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub gi ...
- 使用kubernetes-event-exporter将k8s的事件导出到elasticsearch日志系统中
使用kubernetes-event-exporter将k8s的事件导出到elasticsearch日志系统中 前提 版本 kubernetes v1.17.9 kubernetes-event-ex ...
- Spring security OAuth2.0认证授权学习第一天(基础概念-认证授权会话)
这段时间没有学习,可能是因为最近工作比较忙,每天回来都晚上11点多了,但是还是要学习的,进过和我的领导确认,在当前公司的技术架构方面,将持续使用Spring security,暂不做Shiro的考虑, ...
- 你会Spring Cloud吗?
如果有人问你这句话,你不要急着回答,因为答语和问者的关系莫大. 如果问你的是个老板或管理者,那么他多半不了解这项技术,很有可能只是知道这个技术名词而已,你知道的一定比他们深,你大可夸夸其谈的.在口若悬 ...
- 详解JVM中的内存模型是什么?
强烈推荐 不管是找工作还是提升水平,都建议读一下<深入理解Java虚拟机>这本书,详细讲解了JVM中的内存管理.类加载过程.垃圾回收以及最重要的性能调优实战. 本博客也是参考了这本书,有不 ...
- sudo提权,ansible批量给所有主机创建系统账户,授权
sudo(superuser or another do)让普通用户可以以超级管理员或其他人的身份执行命令. sudo基本流程如下: 1.管理员需要先授权(修改/etc/sudoers文件) 2.普通 ...
- python 3 字典
字典,是可变的无序集合,同时是一种以键值对为基本元素的可以存储各种数据类型的集合,用大括号({})表示字典的开始和结束,元素之间用(,)分隔. 键值对,由键(Key)和值(Value)组成,中间用冒号 ...