mmap使用
[| 2011/06/12 01:35]
最近用到opencv库,该库只能从文件中载入图像,而我的数据是在内存中的。需要将数据映射到文件再供opencv使用,于是想到mmap。
mmap主要是用来将文件的内容映射到内存地址,而将内存中的内容映射到文件不知行不行,于是决定尝试一下。
于是将mmap的第一个参数设置为存放数据的存储区指针,大小设置为数据大小,文件描述符为打开的一个空文件。发现映射前后内存区数值未变化,但是文件内容并未变化,调用msync无效,后来发现映射后的地址和传入的地址不同,原来已被使用的内存地址不能用来mmap,函数自动调整了映射位置,后来又做了些测试,总结如下特性:
1,mmap不能改变对应文件的大小,比如文件之前10k,即使映射100k,文件还是10k。
2,mmap映射大小和文件大小无关,10k的文件可以映射100k出来,当然后90k其实是无意义的。
3,mmap映射后的内存大小以映射时指定大小为准,比如10k文件映射100k,那么对于映射地址可操作的地址空间是100k。
4,mmap只向文件同步修改过的内容,而不是同步不一致的内容,比如映射了10k,目标内存地址原内容和文件内容完全不同,后修改了指定内存地址1k的内容,同步后文件只有1k的内容修改。
以上只是通过测试得出的特性,具体mmap的实现原理还有待读代码体会。
mmap主要是用来将文件的内容映射到内存地址,而将内存中的内容映射到文件不知行不行,于是决定尝试一下。
于是将mmap的第一个参数设置为存放数据的存储区指针,大小设置为数据大小,文件描述符为打开的一个空文件。发现映射前后内存区数值未变化,但是文件内容并未变化,调用msync无效,后来发现映射后的地址和传入的地址不同,原来已被使用的内存地址不能用来mmap,函数自动调整了映射位置,后来又做了些测试,总结如下特性:
1,mmap不能改变对应文件的大小,比如文件之前10k,即使映射100k,文件还是10k。
2,mmap映射大小和文件大小无关,10k的文件可以映射100k出来,当然后90k其实是无意义的。
3,mmap映射后的内存大小以映射时指定大小为准,比如10k文件映射100k,那么对于映射地址可操作的地址空间是100k。
4,mmap只向文件同步修改过的内容,而不是同步不一致的内容,比如映射了10k,目标内存地址原内容和文件内容完全不同,后修改了指定内存地址1k的内容,同步后文件只有1k的内容修改。
以上只是通过测试得出的特性,具体mmap的实现原理还有待读代码体会。