macOS中的mmap和文件删除

macOS中的mmap和文件删除,c,macos,filesystems,system-calls,mmap,C,Macos,Filesystems,System Calls,Mmap,我一直很好奇文件删除对内存映射文件的影响 我查看了文档,发现只要映射文件的内存中没有任何脏范围,就可以删除它。 但是,如果我尝试读取一些磁盘上的文件范围,这些文件在被删除后不在内存中,该怎么办 实验表明,即使在删除后,该文件仍然可读: map = (char *) mmap(0, fileInfo.st_size, PROT_READ, MAP_PRIVATE, fd, 0); remove(fd); for (int i = 0; i < fileInfo.st_size/4; i++

我一直很好奇文件删除对内存映射文件的影响

我查看了文档,发现只要映射文件的内存中没有任何脏范围,就可以删除它。 但是,如果我尝试读取一些磁盘上的文件范围,这些文件在被删除后不在内存中,该怎么办

实验表明,即使在删除后,该文件仍然可读:

map = (char *) mmap(0, fileInfo.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
remove(fd);

for (int i = 0; i < fileInfo.st_size/4; i++)
{
    printf("%lu", map[i]);
}

我的问题是,删除是否在执行之前等待munmap/close,即使文件已从目录树中删除

是,删除操作将等待文件被取消映射

文件系统跟踪有多少链接和引用,例如从进程到文件的链接和引用。in-core inode reference count条目不仅注册了目录结构中的永久链接,或者一个文件可以拥有的多个链接,还注册了从open files表中对其进行的引用

当文件包含在磁盘上的目录中时,从目录条目到该文件有一个链接。您可以使用ln命令将一个文件链接到多个目录中,或者在同一个目录中使用不同的名称。打开文件(包括打开内存映射)时,会使用进程、打开的文件表条目(指向inode)中的引用更新核心inode ref count条目,而当文件取消链接时,由于文件仍在使用,因此会使引用数保持为1。当文件最终分离时,count引用下降到0,然后内核释放文件块


即使使用相同的名称创建文件,上下文也会不同,因为旧名称在文件解除链接时不再存在,因此不会发生冲突,将使用不同的块创建一个全新的文件,而不会对原始映射的文件造成风险。

谢谢,这确实有助于澄清问题。我缺少的一点是,open增加了指向该文件的链接数。