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

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

Изменить: Консультативная блокировка достаточно хороша.

0

Решение

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

Некоторые 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.

1

Другие решения

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

Одним из способов будет использование 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");
0

По вопросам рекламы [email protected]