mmap () и блокировка файлов

Рассмотрим следующий фрагмент (обработка ошибок отсутствует намеренно):

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 () ?

7
задан Michał Górny 20 November 2011 в 16:01
поделиться