示例1:

1.首先建立一个文本文件,名字为tmp,内容为hello world

2.编写mmap.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h> int main()
{
int fd, len;
int *p;
fd = open("tmp", O_RDWR);
if (fd < ) {
perror("open");
exit();
} len = lseek(fd, , SEEK_END);
// 第一个参数代表内存起始地址,设为NULL代表让系统自动选定地址
p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, );
if (p == MAP_FAILED) {
perror("mmap");
exit();
}
// 如果映射成功,修改p[0]
p[] = 0x30313233;
close(fd);
// 释放内存映射地址
munmap(p, len);
return ;
}

3.运行,并查看tmp内容

od -tx1 -tc tmp

0000000 33 32 31 30 6f 20 77 6f 72 6c 64 0a
3 2 1 0 o w o r l d \n
0000014

磁盘文件tmp的内容已被修改.

示例2:利用mmap实现进程间通信

process_mmap_w.c

/* process_mmap_w.c */
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h> #define MAPLEN 0X1000 struct STU {
int id;
char name[];
char sex;
}; void sys_error(char *str, int exitno)
{
perror(str);
exit(exitno);
} int main(int argc, char *argv[])
{ struct STU *mm;
int fd, i = ;
if(argc < ) {
printf("Need filename! \n");
exit();
}
fd = open(argv[], O_RDWR | O_CREAT, );
if (fd < )
sys_error("open", ); if (lseek(fd, MAPLEN-, SEEK_SET) < )
sys_error("lseek", ); if (write(fd, "\0", ) < )
sys_error("write", ); mm = mmap(NULL, MAPLEN, PROT_READ|PROT_WRITE, MAP_SHARED, fd, );
if (mm == MAP_FAILED)
sys_error("mmap", ); close(fd); while() {
mm->id = i;
sprintf(mm->name, "zhang-%d", i);
if (i% == )
mm->sex = 'm';
else
mm->sex = 'w';
i++;
sleep();
}
munmap(mm, MAPLEN);
return ;
}

process_mmap_r.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h> #define MAPLEN 0x1000 struct STU {
int id;
char name[];
char sex;
}; void sys_err(char *str, int exitno)
{
perror(str);
exit(exitno);
} int main(int argc, char *argv[])
{
int fd;
struct STU *mm; if (argc < ) {
printf("Need input filename\n");
exit();
} fd = open(argv[], O_RDWR);
if (fd < )
sys_err("open", ); mm = mmap(NULL, MAPLEN, PROT_READ|PROT_WRITE, MAP_SHARED, fd, );
if (mm == MAP_FAILED)
sys_err("mmap", ); close(fd); unlink(argv[]); while() {
printf("%d\n", mm->id);
printf("%s\n", mm->name);
printf("%c\n", mm->sex);
sleep();
}
munmap(mm, MAPLEN);
return ;
}

运行两个进程:

10
zhang-10
m
11
zhang-11
w
12
zhang-12
m
13
zhang-13
w
14
zhang-14
m

内存控制函数(1)-mmap() 建立内存映射的更多相关文章

  1. Linux内存管理 (9)mmap

    专题:Linux内存管理专题 关键词:文件映射.匿名映射.私有映射.共享映射 mmap/munmap是常用的一个系统调用,使用场景是:分配内存.读写大文件.连接动态库文件.多进程间共享内存. 更详细解 ...

  2. Linux环境编程之共享内存区(一):共享内存区简单介绍

    共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...

  3. C语言 mmap()函数(建立内存映射) 与 munmap()函数(解除内存映射)

    mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和, 最后一个页不被使用的空间将会清零.mmap在用户空间映射调用系统中作用很大. 条件 mmap()必 ...

  4. python标准库基础之mmap:内存映射文件

    #作用:建立内存映射文件而不是直接读取内容文本信息内容:如下(名称是text.txt) Lorem ipsum dolor sit amet, consectetuer adipiscing elit ...

  5. MMAP文件内存映射

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  6. 转:Linux内存管理之mmap详解

    一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.munmap执行相 ...

  7. [转载] Linux内存管理之mmap详解

    转载自http://blog.chinaunix.net/uid-26669729-id-3077015.html 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进 ...

  8. Linux内存管理 (9)mmap(补充)

    之前写过一篇简单的介绍mmap()/munmap()的文章<Linux内存管理 (9)mmap>,比较单薄,这里详细的梳理一下. 从常用的使用者角度介绍两个函数的使用:然后重点是分析内核的 ...

  9. Linux内存管理之mmap详解

    转发之:http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux内存管理之mmap详解 一. mmap系统调用 1. mmap系统调用  ...

随机推荐

  1. 如何通过.reg文件来修改注册表键和子键以及键值

    无废话, 直接上例子, 自己运行一下便知. 然后根据自己需要改改就可以随便用了.   添加key, subkey, 和设置键值的例子. ==================== Windows Reg ...

  2. vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题

    Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当前组件元素,它是通过使 ...

  3. 【云计算】使用privilege权限对Docker内核参数进行定制

    探讨Docker容器中修改系统变量的方法 探讨完Docker对共享内存状态持久化的支持状况后,我将遗留产品build到一个pre-production image中,测试启动是否OK.很显然,我过于乐 ...

  4. HTML中的attribute和property

    一.概述 attribute和property是常常被弄混的两个概念. 简单来说,property则是JS代码里访问的: document.getElementByTagName('my-elemen ...

  5. 吐槽win7

    在纠结了N次后,终于重装win7了.其间还是不死心,又找了新的xp版本来装了一下,确实不行,才心不甘情不愿地再次回到win7下. 说实话,Win7的各种新功能,我没有感觉到有多好,只有不适应,如: 资 ...

  6. [AngularJS] Angular 1.3 Anuglar hint

    Read More: http://www.linkplugapp.com/a/953215 https://docs.google.com/document/d/1XXMvReO8-Awi1EZXA ...

  7. POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题

    题意:给出一个序列,求出每连续k个数字中最大的数和最小的数. 这是道单调队列裸题,直接写就行了. 本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说 ...

  8. Failed to initialize storage module: user 的解决方式

    网上提供了一种解决方法就是在session_start()前把session的存储方式改为files,即加入以下一句代码 if (ini_get('session.save_handler') !== ...

  9. linux下php添加cur/soapl扩展

    注意:在不同的扩展路径下 ./configure --help 的帮助信息不尽相同 1.跟php一起安装 下载 http://curl.haxx.se/download/ curl 取较低的版本 wg ...

  10. 正则表达式总结 java 等

    这个经常用的到,就来总结一下 #一下是JAVA中的正则表达式 在 JDK1.4 里有了自己的正则表达式 API 包,JAVA 程序员可以免去找第三方提供的正则表达式库的周折了,我们现在就马上来了解一下 ...