Рассмотрим следующий фрагмент (обработка ошибок отсутствует намеренно):
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-time.
За mmap(3p)
:
Функция mmap () добавляет дополнительную ссылку на файл, связанный с
дескриптор файла fildes, который не удаляется последующей close () в этом файле
дескриптор. Эта ссылка должна быть удалена, когда больше нет сопоставлений с
файл.
Но за lockf(3p)
:
Блокировки файлов снимаются при первом закрытии в процессе блокировки любого файла.
дескриптор файла.
Итак, используя lockf()
, мне пришлось бы держать fd открытым и хранить его ссылку в течение очень долгого времени. Есть ли лучший портативный метод, обеспечивающий блокировку файла до вызова munmap()
?