После проведенного мною исследования я все еще не уверен, существуют ли 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)
страница руководства:
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.
Другой способ будет использовать файл блокировки — файл рядом с исходным, указывающий, что блокировка активна. C11 определяет модификатор x
мод в fopen
, который гарантирует, что файл всегда создается и не открывается, если он уже существует:
FILE * f = fopen("filename.lock", "wx");
if (!f) {
// File already exists!
return 0;
}
// Do stuff
fclose(f);
remove("filename.lock");