在 iOS 中删除内存映射文件 - 幕后发生了啥?

Posted

技术标签:

【中文标题】在 iOS 中删除内存映射文件 - 幕后发生了啥?【英文标题】:Deleting a memory-mapped files in iOS - what's going on behind the scenes?在 iOS 中删除内存映射文件 - 幕后发生了什么? 【发布时间】:2012-08-07 17:50:30 【问题描述】:

我有一个文件,我用 NSData 进行内存映射。然后我通过 NSFileManager 删除此文件而没有任何错误,并继续检查该文件是否确实不存在(就 NSFileManager 和 ls 而言)。但是,我仍然可以从之前从 NSData 获得的字节指针读取数据!

在模拟器中,我有时会遇到看似无关的崩溃。在设备上,一切似乎都运行良好。我很想知道发生了什么,以及我应该期待什么(我过去的预期是在尝试删除文件时出现错误,或者在删除文件后尝试访问它时崩溃)。

谢谢!

【问题讨论】:

【参考方案1】:

如果您没有取消映射内存,那么您使用文件指针创建的 mmap 会阻止文件被删除(即使您看不到它)。在删除引用的文件之前,您应该始终取消映射内存。

[这与一个古老的 UNIX 技巧有关——打开一个文件,一旦你有一个文件描述符然后取消链接该文件——你有一个文件你可以用它做事但没有人能看到,如果你崩溃文件完全消失走开!]

【讨论】:

有趣。这是在某处记录的吗?另外,操作系统会阻止这些字节被覆盖吗?所以从技术上讲,我可以用幽灵文件填充整个存储设备,没有可用内存,而用户会认为设备有很多可用内存? 好吧,这些幽灵文件只有在您的应用程序运行时才会存在。当我创建文件时,我一直使用这种技术,如果应用程序崩溃,我想消失 - 可以说是临时文件 - 而不是在启动时清除我的内部目录。我找到了这个链接:en.wikipedia.org/wiki/Unlink_(Unix) 但你可以找到其他人在谷歌上搜索“unix 技巧取消链接打开文件”。有关其工作原理的所有信息都记录在案,只是该技术不在我所知道的任何手册页中。 这在您附近的 Unix 终端上的 man 2 unlink 中有记录 :-) (至少它说取消链接仍然打开的文件实际上不会删除该文件 - 它不会解释这有什么好处)

以上是关于在 iOS 中删除内存映射文件 - 幕后发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章

当我创建一个与访问中的其他查询一起使用的查询时,幕后发生了啥?

lock 语句在幕后做了啥?

MSCK REPAIR TABLE 在幕后做了啥,为啥这么慢?

当我从 .NET 生成一个新线程时到底发生了啥?

`HTTPContext.SignInAsync` 在幕后做了啥?

android“强制关闭”内存到底发生了啥