C ++, как проверить, используется ли файл - многопоточная многопроцессорная система - PullRequest
2 голосов
/ 18 февраля 2012

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

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

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

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

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

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

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

1 голос
/ 18 февраля 2012

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

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

1 голос
/ 18 февраля 2012

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

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

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

...