2014-11-12 4 views
0

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

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

+0

Вы имеете в виду «исключительно», а не «чрезмерно», верно? – trojanfoe

+0

@trojanfoe - Конечно. Спасибо – Sanich

+1

См. [Этот вопрос] (http://stackoverflow.com/questions/13603684/mandatory-file-locking-in-mac-os-x). – trojanfoe

ответ

0

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

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

Что значит паст? – Sanich

+0

@ Sanich Он не является частью стандарта C/C++, поэтому он специфичен для среды. См. Добавленный 'flock (2)' manpage snippet – Erbureth

+0

@Sanich: некоторые Unix-подобные системы могут не иметь 'flock()'; например, они могут иметь 'lockf()', или они могут иметь только 'fcntl()' блокировку. Текущая версия POSIX требует «блокировки fcntl()» и блокировки lockf() ', а также' flockfile() ',' funlockfile() 'и' ftrylockfile() '- которые я только сейчас наткнулся, re используется для управления блокировкой между потоками в приложении). AFAIK, вы можете реализовать блокировку 'lockf()' и 'flock()', используя 'fcntl()' блокировку. –

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.