删除iOS中的内存映射文件 - 幕后发生了什么?

Vla*_*nko 5 memory-mapped-files nsdata ios

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

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

谢谢!

Dav*_*d H 6

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

[这涉及一个旧的UNIX技巧 - 打开一个文件,一旦你有一个文件描述符然后取消链接文件 - 你有一个文件,你可以做的事情但没有人可以看到,如果你崩溃文件完全消失!]

  • 好吧,只要您的应用程序正在运行,这些ghost文件就会存在.我在创建文件的时候一直使用这种技术,如果应用程序崩溃我想要消失 - 临时文件可以这么说 - 而不是在我启动时清除我的内部目录.我找到了这个链接:http://en.wikipedia.org/wiki/Unlink_(Unix)但你可以找到其他谷歌搜索"unix技巧unlink open file".关于它如何工作的所有信息都记录在案,它的技术不在我所知的任何手册页中. (2认同)
  • 这在你附近的Unix终端上的`man 2 unlink`中有记录:-)(至少它说取消链接一个仍然打开的文件实际上不会删除文件 - 它没有解释那对什么有用) (2认同)