После исследования, которое я сделал, я все еще не уверен, есть ли API, который позволяет вам открывать файл исключительно, то есть любой другой процесс не будет иметь права на файл. Пожалуйста, может кто-нибудь дать мне хорошую ссылку/руководство/примечание/руководство, которое охватывает эту тему?
Большое спасибо!
Редактировать: консультационная блокировка достаточно хороша.
Существуют три первичные системы для блокировки файлов между процессами:
Некоторые 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.
Чтобы предотвратить чтение файлов из нескольких процессов, все они должны реализовать один и тот же механизм блокировки.
Один из способов - использовать механизм 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");
flock(2)