Рассмотрим следующий фрагмент (обработка ошибок отсутствует намеренно):
void* foo(const char *path, off_t size) {
int fd;
void *ret;
fd = open(path, O_RDWR);
lockf(fd, F_LOCK, 0);
ret = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
return ret;
}
Итак, идея состоит в том, чтобы открыть файл mmap ()
и вернуть только указатель данных. Было бы здорово, если бы файл можно было заблокировать и на время mmap.
Согласно mmap (3p)
:
Функция mmap () должна добавлять дополнительную ссылку на файл, связанный с файловым дескриптором fildes , который не удаляется при последующем закрытии () для этого файлового дескриптора . Эта ссылка должна быть удалена, когда больше нет сопоставлений с файлом.
Но согласно lockf (3p)
:
Блокировки файлов должны сниматься при первом закрытии посредством процесса блокировки любого файлового дескриптора для файла.
Итак, используя lockf ()
, мне пришлось бы держать fd открытым и переносить его ссылку в течение ужасно долгого времени. Есть ли лучший переносимый метод, обеспечивающий блокировку файла до вызова munmap ()
?