如何快速找回意外删除的Excel文件?
1282
2022-05-29
1、mmap()函数用来将文件或者设备映射到内存中。
2、mmap的特点是按需调页。最开始只申请vma,并不调真正的页。当对某些页进行引用的时候,会引起一个缺页中断,再将页面调入到内存当中,这样避免了对内存的浪费。
mmap的优势: 操作文件就像操作内存一样,适合于对较大文件的读写。
mmap的缺点:
1、文件如果很小,比如60bytes,由于在内存当中的组织都是按页组织的,将文件调入到内存当中是一个页4k,这样其他的4096-60=4036 bytes的内存空间就会浪费掉了。
2、而且文件无法完成拓展,因为mmap到内存的时候,你所能够操作的范围就确定了,无法增加文件的长度。
3、如果系统频繁的使用mmap操作,而且每次mmap的size都不同,那么就会使得内存可能缺少足够的连续的内存空间。
那又怎么了,人家就是用来操作大型数据的。
当mmap的文件是page size的整数倍的时候,使用mmap调用看起来是最合适的,不会造成浪费。
你用其他方式来进行大量数据传递简直不理智。
1、开启文件空间映射函数mmap()
#include
1
2
3
4
5
6
7
参数释义:
start:用户所要映射的目的地址,一般放NULL,让系统自己去找。
length:顾名思义。
prot:映射区保护方式,取值范围
{
PROT_EXEC:映射区可执行
PROT_READ:映射区可读取
PROT_WRITE:映射区可写入
PROT_NONE:映射区不可存取
}
如果要几个功能合在一起,用管道符 | 连通
当然,权限最高的还是映射的文件,如果被映射文件不让读,那就没办法读。
flags:对映射对象的配置
{
MAP_FIXED:一般不用
MAP_SHARED:共享映射区
MAP_PRIVATE:读时共享,写时复制,对映射区的操作不会对原文件造成影响
MAP_ANONYMOUS:建立匿名映射,不涉及文件,所以用不到fd,也不允许与其他进程共享
MAP_DENYWRITE:对文件的写操作将被禁止,只能通过映射文件对原文件进行操作
MAP_LOCKED:将映射区锁定,不会被虚拟内存重置
}
shared和private必须且只能选一个。
fd:代表文件的文件描述符。
offset:偏移量。一般设为0,表示从头开始映射。
2、解除映射函数munmap()
//系统调用munmap() int munmap( void * addr, size_t len ) /*该调用在进程地址空间中解除一个映射关系,addr是调用mmap()时返回的地址,len是映射区的大小。当映射关系解除后,对原来映射地址的访问将导致段错误发生。*/
1
2
3
4
5
6
实例代码:
#include
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
任务调度
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。