mmap () и блокировка файлов - PullRequest
7 голосов
/ 20 ноября 2011

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

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

Ответы [ 2 ]

5 голосов
/ 20 ноября 2011

Попробуйте использовать flock (2) , документация которого гласит: «Блокировка снимается либо явной операцией LOCK_UN на любом из этих дублирующих дескрипторов, либо когда все такие дескрипторы закрыты».

0 голосов
/ 20 ноября 2011

Нет, нет. У вас есть несколько вариантов, в порядке простоты использования:

  • Держите fd открытым.
  • Поместите мьютекс в отображаемую область.
  • Использовать отдельный файл блокировки.

Я не буду вдаваться в подробности для них здесь, в любом случае есть другие вопросы, описывающие их лучше.

...