删除内存映射文件的最后一个链接是否安全

时间:2018-03-27 17:58:19

标签: c posix mmap unlink

有时我使用以下代码片段来读取文件(省略错误检查代码):

db = open(db_path, O_RDONLY);
fstat(db, info);
buffer = mmap(0, info->st_size, PROT_READ, MAP_PRIVATE, db, 0);
close(db);

请注意,我在调用mmap后关闭文件。一旦我完成了buffer

munmap(buffer, info->st_size);

如果有人从文件系统中删除了文件的最后一个硬链接(例如unlink(db_path)),并且没有进程有文件描述符,会发生什么?这会导致未定义的行为还是操作系统保留文件,直到它被取消映射?我找不到明确陈述其中一个的文档。

1 个答案:

答案 0 :(得分:2)

来自the official POSIX reference on mmap

  

mmap()函数应添加对与文件描述符fildes关联的文件的额外引用,该文件描述符fildes不会被该文件描述符上的后续close()删除。当没有更多映射文件时,应删除此引用。

munmap调用之前,使用映射文件是安全的。