注册 登录
  • 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

linux c 内存映像

docker 水墨上仙 2284次浏览 已收录 手机上查看

内存映像其实就是在内存中创建一个和外存文件完全相同的映像。用户可以将整个文件映射到内存中也可以部分映射到内存。系统会将对内存映像的改动如实的反映到外存文件中。从而实现了通过内存映像对外存文件的操作。

内存映像的特点:
1、 可以加快对IO的操作速度。
2、 用户可以通过指针对文件进行操作,间接~~~
3、 实现了文件数据的共享,将外存文件映射到共享内存中,很方便的实现了数据共享,并能完成把数据保存到外存的工作。

注:内存映像只能对内部可以定位的文件进行操作,如普通文件。不能对管道,套接字文件进行操作。
来源:http://blog.csdn.net/muge0913/article/details/7315197

创建内存映射:

#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表示所映像的内容距文件头的距离。
&nbsp
撤销内存映射:

#include<sys/types.h>
#include<sys/mman.h>
int munmap(void *start,size_t length);

改变内存属性:
修改保护值:

int protect(const void *addr,size_tlength,int prot);

flg用于设置是否在需要移动内存镜像时移动该镜像。如:MRMAP_MAYMOVE
调用成功返回新的起始地址,失败返回-1

程序如下:

 #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;    
}


喜欢 (0)
[开心洋葱]
分享 (0)
关于作者:
水墨上仙
……
加载中……