示例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. 更改Thunderbird的默认语言

    使用的Thunderbird Poratable版本是英文的,可以用以下方式修改为中文界面: 1.下载中文语言包 在官方网站的https://addons.mozilla.org/en-US/thun ...

  2. ASP.NET 5 Beta6发布了(翻译)

    感觉就好像我们刚刚发布了一个版本,现在我们又要发布一个新的版本.开发团队通过努力工作在Visual Studio2015的正式版上提交使用ASP.NET 5开发工具的上的更新以及库的更新.新的版本为b ...

  3. Node.js:Stream(流)

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...

  4. Java GC、新生代、老年代

    堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( ...

  5. MapReduce开发技巧

    数据类型的选择 自定义数据类型 参考:Hadoop提交作业自定义排序和分组 MapWritable/SortedMapWritable Hadoop中可传输的Map集合,和Java中的Map用法差不多 ...

  6. win10 mysql57密码重置

    [摘要: 1.my-default.ini 更名my.ini 正在解压的目次上面复造my-default.ini一份更名字为 my.ini. 2.翻开 Windows 情况变量设置, 新建变量名 MY ...

  7. Unity5.1 新的网络引擎UNET(十五) Networking 引用--下

     孙广东 2015.7.21 本节提供了与网络系统一起使用的组件的具体信息. 10.Network Proximity Checker Suggest a change Success! Than ...

  8. IOS一句话总结基础知识

    1.OC语言中除基本数据类型外的类型都是指针类型:OC中的对象是通过指针对其操作的. 2.宏定义不是语句,所以不能要分好,如#define kCities @"cities" 3. ...

  9. T-SQL 之 表变量和临时表

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...

  10. Mysql创建、删除用户、查询所有用户等教程,提升您的MYSQL安全度!

    建议您不要使用mysql的root账号来为您的web页面连接数据库,这可能会导致用户通过网页获取到您的数据库账号密码,存在严重的安全隐患. 建议新建一账号,权限设置基本够用,然后使用那新建的账号来连接 ...