Безопасно ли удаляет последнюю ссылку на файл с отображением памяти

Иногда я использую следующий фрагмент кода для чтения файлов (код проверки ошибок опущен):

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)) и ни у одного процесса нет дескриптора файла? Приведет ли это к неопределенному поведению или операционная система хранит файл до тех пор, пока он не будет удален? Я не смог найти документацию, в которой явно указано одно или другое.


person martinkunev    schedule 27.03.2018    source источник


Ответы (1)


Из официального справочника по POSIX на mmap

Функция mmap() должна добавить дополнительную ссылку на файл, связанный с fildes дескриптора файла, который не удаляется последующим close() в этом дескрипторе файла. Эта ссылка должна быть удалена, когда больше нет сопоставлений с файлом.

Таким образом, можно безопасно использовать сопоставленный файл до вызова munmap.

person Some programmer dude    schedule 27.03.2018