Предотвращение открытия файла дважды из разных процессов

0

После исследования, которое я сделал, я все еще не уверен, есть ли API, который позволяет вам открывать файл исключительно, то есть любой другой процесс не будет иметь права на файл. Пожалуйста, может кто-нибудь дать мне хорошую ссылку/руководство/примечание/руководство, которое охватывает эту тему?
Большое спасибо!

Редактировать: консультационная блокировка достаточно хороша.

  • 0
    Вы имеете в виду «исключительно», а не «чрезмерно», верно?
  • 0
    @trojanfoe - Конечно. Спасибо
Показать ещё 2 комментария
Теги:
macos
file-locking

2 ответа

1

Существуют три первичные системы для блокировки файлов между процессами:

Некоторые Unix-подобные системы могут не иметь flock(); например, у них может быть lockf(), или у них может быть только блокировка fcntl() (хотя большинство из них будет иметь как lockf() и fcntl() и многие из них также будут иметь flock()). Текущая версия POSIX предусматривает блокировку fcntl() блокировку lockf() для блокировки между процессами на уровне файлов. (POSIX также определяет flockfile(), funlockfile() и ftrylockfile() которые используются для управления блокировкой между потоками в приложении).

AFAIK, вы можете реализовать lockf() и flock() с помощью блокировки fcntl().

Обратите внимание, что функции блокировки работают с файловыми дескрипторами или файловыми потоками. Каждая программа сможет открыть файл, но затем будет применять консультативные блокирующие вызовы, чтобы проверить, имеет ли он эксклюзивный доступ к файлу.

Обратите внимание, что некоторые системы поддерживают обязательную блокировку файлов (указывается путем установки бита setgid в файле, в то время как бит выполнения соответствующей группы не установлен - например, режим 2644). Однако Mac OS X не поддерживает обязательную блокировку (10.10 Yosemite проверено, но предыдущие версии также имеют это ограничение). POSIX не требует обязательной поддержки блокировки. Он был предоставлен в системах SVR4.

0

Чтобы предотвратить чтение файлов из нескольких процессов, все они должны реализовать один и тот же механизм блокировки.

Один из способов - использовать механизм flock, который недоступен везде. Из flock(2) manpage:

CONFORMING TO
    4.4BSD (the flock() call first appeared in 4.2BSD).
    A version of flock(), possibly implemented in terms of fcntl(2),
    appears on most UNIX systems.

Другой способ - использовать файл lockfile вместе с оригиналом, указывающим, что блокировка активна. C11 определяет модификатор x для режима в fopen, который гарантирует, что файл всегда создается и не открывается, если он уже существует:

FILE * f = fopen("filename.lock", "wx");
if (!f) {
    // File already exists!
    return 0;
}

// Do stuff
fclose(f);
remove("filename.lock");
  • 0
    Что вы имеете в виду, что стадо доступно не везде?
  • 0
    @Sanich Он не является частью стандарта C / C ++, поэтому он зависит от среды. Смотрите добавленный фрагмент справки flock(2)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню