С++, как проверить, используется ли файл - многопоточная многопроцессорная система

С++: Есть ли способ проверить, был ли файл открыт для записи другим процессом/классом/устройством?

Я пытаюсь прочитать файлы из папки, к которой могут обращаться другие процессы для записи. Если я читаю файл, который одновременно записывается, как чтение, так и процесс записи дают мне ошибки (запись неполна, я могу получить только заголовок). Поэтому я должен проверить какое-то условие, прежде чем решиться, открыть ли этот файл. Я использую boost:: filesystem, чтобы получить список файлов. Я хочу совместимость как с Unix, так и с Windows.

3 ответа

Вы должны использовать блокировку файлов. В Unix это flock, в Windows это LockFile.

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

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

Поскольку вы говорите, что ваша система является многопроцессорной (т.е. не многопотоковой), вы не можете использовать переменную условия (если она не используется в межпроцессной общей памяти). Вы также не можете использовать один писатель в качестве координатора, если вы не хотите передавать данные там через сокеты или общую память.


Очень приятное решение можно найти здесь, используя активный объект Sutter https://sites.google.com/site/kjellhedstrom2/active-object-with-cpp0x

Это довольно продвинутый, но очень хорошо масштабируемый на многих ядрах.


Из того, что я понимаю о boost::filesystem, вы не получите необходимую детализацию из этого набора функций для выполнения задач, которые вы запрашиваете. В общем, вы можете выбрать два разных подхода:

  • Использовать механизм синхронизации, такой как семафор с именем, видимым на уровне файловой системы.
  • Используйте блокировки файлов (т.е. fcntl или flock в системах POSIX)

К сожалению, оба подхода будут ориентированы на платформу или, по крайней мере, специфичны для POSIX и Win32.

licensed under cc by-sa 3.0 with attribution.