好贷网好贷款

那年,一步一步学linux c ---内存映像~~那些事~~

发布时间:2016-12-5 6:36:52 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"那年,一步一步学linux c ---内存映像~~那些事~~",主要涉及到那年,一步一步学linux c ---内存映像~~那些事~~方面的内容,对于那年,一步一步学linux c ---内存映像~~那些事~~感兴趣的同学可以参考一下。

转自:http://blog.csdn.net/muge0913/article/details/7315197 那年,一步一步学linux c ---内存映像~~那些事~~ 分类: 嵌入式linux c 编程 2012-03-03 15:49 3598人阅读 评论(13) 收藏 举报 linuxcnull工作io 转载请注明出处:http://blog.csdn.net/muge0913/article/details/7315197 内存映像其实就是在内存中创建一个和外存文件完全相同的映像。用户可以将整个文件映射到内存中也可以部分映射到内存。系统会将对内存映像的改动如实的反映到外存文件中。从而实现了通过内存映像对外存文件的操作。 内存映像的特点: 1、 可以加快对IO的操作速度。 2、 用户可以通过指针对文件进行操作,间接~~~ 3、 实现了文件数据的共享,将外存文件映射到共享内存中,很方便的实现了数据共享,并能完成把数据保存到外存的工作。 注:内存映像只能对内部可以定位的文件进行操作,如普通文件。不能对管道,套接字文件进行操作。 创建内存映射: [cpp] view plaincopyprint? #include<sys/types.h> #include<sys/mman.h> void *mmap(void *start,size_t length,intport,int flag,int fd,off_t offset) #include<sys/types.h> #include<sys/mman.h> void *mmap(void *start,size_t length,intport,int flag,int fd,off_t offset) start为指针通常设为NULL,表示映射内存有系统决定。因为指定内存会经常出错。 length为内存映像占用的内存空间大小。以字节为单位。 port表示内存映像的安全性。 PROT_EXEC表示被映像内存可能有机器码,可执行。 PORT_NONE表示被映像内存不能被访问。 PORT_READ表示被映像内存可读 PORT_WRITE表示被映像内存可写 flag内存映像标志: MAP_FIXED表示如果无法从start地址建立内存映像,则出错返回。 MAP_PRIVATE表示对内存映像进行的改动不反映到外存文件中。 MAP_SHARED表示对内存映像进行的改动反映到外存文件中。 fd文件描述符 offset表示所映像的内容距文件头的距离。 撤销内存映射: [cpp] view plaincopyprint? #include<sys/types.h> #include<sys/mman.h> int munmap(void *start,size_t length); #include<sys/types.h> #include<sys/mman.h> int munmap(void *start,size_t length); 改变内存属性: 修改保护值: [cpp] view plaincopyprint? int protect(const void *addr,size_tlength,int prot); int protect(const void *addr,size_tlength,int prot); addr表示地址和上面相同。 length内存映像大小同上。 prot重新设定的保护值。 成功返回0失败返回-1 修改内存镜像大小: [cpp] view plaincopyprint? void *mremap(void *old_addr,size_told_length,size_t new_length,unsigned long *flag) void *mremap(void *old_addr,size_told_length,size_t new_length,unsigned long *flag) flg用于设置是否在需要移动内存镜像时移动该镜像。如:MRMAP_MAYMOVE 调用成功返回新的起始地址,失败返回-1 程序如下: [cpp] view plaincopyprint? #include <stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<sys/mman.h> int main() { int fd; char *start; char buf[100]; /*打开文件*/ fd = open("testfile",O_RDWR); start=mmap(NULL,lseek(fd,0,SEEK_END),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); /* 读出数据 */ strcpy(buf,start); printf("mmap = %s\n",buf); /* 写入数据 */ strcpy(start,"Buf Is Not Null!"); printf("mmap:%s\",start); munmap(start,100); /*解除映射*/ close(fd); return 0; }

上一篇:win8 vs2012 for wp 环境搭建
下一篇:poj——1088(dp之递归加记忆化搜索)

相关文章

相关评论