内存控制函数(1)-mmap() 建立内存映射
示例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() 建立内存映射的更多相关文章
- Linux内存管理 (9)mmap
专题:Linux内存管理专题 关键词:文件映射.匿名映射.私有映射.共享映射 mmap/munmap是常用的一个系统调用,使用场景是:分配内存.读写大文件.连接动态库文件.多进程间共享内存. 更详细解 ...
- Linux环境编程之共享内存区(一):共享内存区简单介绍
共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...
- C语言 mmap()函数(建立内存映射) 与 munmap()函数(解除内存映射)
mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和, 最后一个页不被使用的空间将会清零.mmap在用户空间映射调用系统中作用很大. 条件 mmap()必 ...
- python标准库基础之mmap:内存映射文件
#作用:建立内存映射文件而不是直接读取内容文本信息内容:如下(名称是text.txt) Lorem ipsum dolor sit amet, consectetuer adipiscing elit ...
- MMAP文件内存映射
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 转:Linux内存管理之mmap详解
一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.munmap执行相 ...
- [转载] Linux内存管理之mmap详解
转载自http://blog.chinaunix.net/uid-26669729-id-3077015.html 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进 ...
- Linux内存管理 (9)mmap(补充)
之前写过一篇简单的介绍mmap()/munmap()的文章<Linux内存管理 (9)mmap>,比较单薄,这里详细的梳理一下. 从常用的使用者角度介绍两个函数的使用:然后重点是分析内核的 ...
- Linux内存管理之mmap详解
转发之:http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux内存管理之mmap详解 一. mmap系统调用 1. mmap系统调用 ...
随机推荐
- LaTeX排版设置图表的位置 Positioning images and tables
Positioning images and tables LATEX is an editing tool that takes care of the format so you only hav ...
- RTF文件合并 备忘
多个独立的rtf文件合并时,如果文件纸张方向存在横向 纵向不一致时,文件之间需要插入分节符 \pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\aspa ...
- 进程控制块(PCB)结构
一.进程控制块(PCB)结构 进程控制块(PCB)是系统为了管理进程设置的一个专门的数据结构.系统用它来记录进程的外部特征,描述进程的运动变化过程.同时,系统可以利用PCB来控制和管理进程,所以说,P ...
- C#好书盘点
C#是学习asp.net和.NET Winform程序的基础,所以一定要学好.从00年C#出道到现在,7年过去了,C#的书出了许多,有不少好书. 1.<21天学通C# > 作者:作者:(美 ...
- C++如何禁止掉对象的复制操作
最容易想到的是将拷贝构造函数与赋值函数声明为private.但是,private只是说外部不能直接调用,但是可以间接通过类的成员函数与友元函数对其访问.那么怎么办呢? ---->在类中,允许声明 ...
- PlSQL Oracle 中的 对应 SQL server 中的 IsNull(Expr1,Expr2)
NVL(Expr1,Expr2)如果Expr1为NULL,返回Expr2的值,否则返回Expr1的值NVL2(Expr1,Expr2,Expr3)如果Expr1为NULL,返回Expr2的值,否则返回 ...
- 【Networking】网络编程常见问题汇总
[百度分享]网络编程常见问题总结 串讲(一)网络编程常见问题总结 在网络程序中遇到的一些问题进行了总结, 这里主要针对的是我们常用的TCP socket相关的总结, 可能会存在错误, 有任何问题 ...
- WinForm 窗口缩放动画效果
using System; using System.Collections.Generic; using System.Text; using System.Threading; using Sys ...
- Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)
本文链接 http://blog.csdn.net/xiaodongrush/article/details/29170099 參考文章 http://my.oschina.net/le ...
- Citrix服务器虚拟化之二十九 XenApp 6.5发布服务器上的应用程序
Citrix服务器虚拟化之二十九 XenApp 6.5发布服务器上的应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1) 服务器桌面:发布场中服务 ...