当前位置: 技术问答>linux和unix
mmap函数建立文件的内存映射后,删除文件,能正常读取内容吗?
来源: 互联网 发布时间:2016-11-11
本文导语: 运行的结果是,能正常读写,但不清楚为什么!有两种可能: 1 内存映射对应一块硬盘空间,文件删除后,内容还在,所以能读取。但如果别的进程把这块空间占了,就危险了。 这样,总归有出错的可能性。 2...
运行的结果是,能正常读写,但不清楚为什么!有两种可能:
1 内存映射对应一块硬盘空间,文件删除后,内容还在,所以能读取。但如果别的进程把这块空间占了,就危险了。
这样,总归有出错的可能性。
2 内存映射对应一块硬盘空间,只要映射不解除,即使文件删除,硬盘上的那块空间还处于保护状态,这样算是安全的。
比如
void* addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fildes, 0);
指针addr 没有释放之前,原来硬盘上的那块区域能被别的进程写入吗?纠结中。
1 内存映射对应一块硬盘空间,文件删除后,内容还在,所以能读取。但如果别的进程把这块空间占了,就危险了。
这样,总归有出错的可能性。
2 内存映射对应一块硬盘空间,只要映射不解除,即使文件删除,硬盘上的那块空间还处于保护状态,这样算是安全的。
比如
void* addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fildes, 0);
指针addr 没有释放之前,原来硬盘上的那块区域能被别的进程写入吗?纠结中。
|
文件删除之后,并没有真正删除,直到所有访问这个文件的进程关闭对应的描述符为止
|
在文件系统中每一个inode都有一个引用值, 所谓的删除并不是真正的从文件系统中删除,只是把引用值减一,知道最后一个使用文件的进程结束后,才真正的把这个文件删除。
|
apue上一句话:as long as some process has the file open, its contents will not be deleted
删除文件时,只要有进程正打开着那个文件,其内容不会被删除
这时内核应该采用某种机制防止硬盘上的这块数据被其它进程使用
内存映射时,你是不是没有关闭那个文件描述符,试试关闭描述符,再删除,看看结果..
删除文件时,只要有进程正打开着那个文件,其内容不会被删除
这时内核应该采用某种机制防止硬盘上的这块数据被其它进程使用
内存映射时,你是不是没有关闭那个文件描述符,试试关闭描述符,再删除,看看结果..
|
从你的需求来看,内存映射与文件保护关系不大啊
你解密之后,删除之前 --如果这时有人读文件,盗用成功
你也可以这样,不用内存映射,直接分配一个局部变量,读入文件全部内容,然后删除文件。
与你的内存映射效果差不多吧..
你解密之后,删除之前 --如果这时有人读文件,盗用成功
你也可以这样,不用内存映射,直接分配一个局部变量,读入文件全部内容,然后删除文件。
与你的内存映射效果差不多吧..
|
怀疑内存映射机制隐式的打开了文件
可以试验一下:
先打印一下当前的fildes的值;
在mmap()内存映射之后,munmap()之前,再随便打开一个另外一个文件,记录此时的文件描述符的值,然后关闭;
在munmap()之后,再随便打开一个文件,记录此时的文件描述符的值;
对比一下两个值是否相等
可以试验一下:
先打印一下当前的fildes的值;
在mmap()内存映射之后,munmap()之前,再随便打开一个另外一个文件,记录此时的文件描述符的值,然后关闭;
在munmap()之后,再随便打开一个文件,记录此时的文件描述符的值;
对比一下两个值是否相等
|
你所谓的 “读写” 都是针对内存的,这里相当于把文件加载到了内存。
在linux下执行可执行程序时照样可以删掉这些文件。一个道理。
在linux下执行可执行程序时照样可以删掉这些文件。一个道理。
|
如果要搞明白这个问题,需要深入了解内存映射的机制
在了解内存映射的机制之前,保险的做法:
在munmap()之前,不要close()文件,这样即使删除了硬盘上的文件,其内容也不会被删除。
在了解内存映射的机制之前,保险的做法:
在munmap()之前,不要close()文件,这样即使删除了硬盘上的文件,其内容也不会被删除。