Монопольный доступ к файлу в С/C++
От: Аноним  
Дата: 06.09.11 15:03
Оценка:
Есть 2 проги. Одна пишет в файл, другая читает. У меня нет доступа к проге, ктр. пишет в файл.
Ну как минимум она открывает его в режиме записи . Моя программа читает из этого файла.
Я не знаю когда начинается и когда заканчивается процесс записи. Факт в том что моя прога иногда заваливается —
ну скорее всего это происходит когда первая прога очищает файл и начинает запись — в результате некорректные
положения указателя в моей проге, либо что то другое. Подскажите как решить данную проблему.
Каким образом синхронизировать 2 процесса. Может реализовать монопольный доступ ? И каким образом ?
Желательно решение на ANSI C.
Re: Монопольный доступ к файлу в С/C++
От: sysenter  
Дата: 06.09.11 15:06
Оценка: +3
Здравствуйте, Аноним, Вы писали:

А>Может реализовать монопольный доступ ? И каким образом ?

А>Желательно решение на ANSI C.

Платформозависимое API, только так, Win — LockFile, LockFileEx; Linux — fcntl, flock.
Re[2]: Монопольный доступ к файлу в С/C++
От: vayerx  
Дата: 06.09.11 16:29
Оценка:
Здравствуйте, sysenter, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Может реализовать монопольный доступ ? И каким образом ?

А>>Желательно решение на ANSI C.

S>Платформозависимое API, только так, Win — LockFile, LockFileEx; Linux — fcntl, flock.


Если не на на ANSI C, то есть портабельная(tm) обертка: boost::interprocess::file_lock
Re[3]: Монопольный доступ к файлу в С/C++
От: solo700  
Дата: 06.09.11 17:01
Оценка:
Спасибо ! Рассмотрю все предложения.
Re[2]: Монопольный доступ к файлу в С/C++
От: sysenter  
Дата: 06.09.11 17:48
Оценка:
Здравствуйте, sysenter, Вы писали:

S>Платформозависимое API, только так, Win — LockFile, LockFileEx; Linux — fcntl, flock.


В Linux ещё есть lockf(), позволяет избегать взаимной блокировки файлов возвращая EDEADLK.
Re: Монопольный доступ к файлу в С/C++
От: MasterZiv СССР  
Дата: 07.09.11 05:42
Оценка: +1
On 06.09.2011 19:03, Аноним 496 wrote:

> Каким образом синхронизировать 2 процесса. Может реализовать монопольный доступ

> ? И каким образом ?
> Желательно решение на ANSI C.

Тебе надо не блокировать файл (просто завалиш ту другую прогу), а правильно
обрабатывать ошибки при чтении и правильно это чтение делать.
А именно -- каждую операцию чтения делать "с нуля", не надеясь, что
предыдущая где-то закончилась и оставила указатель файла.

Если правильно делать все операции ввода на С, то программа не должна
падать, максимум -- она должна что-то не читать.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Монопольный доступ к файлу в С/C++
От: sysenter  
Дата: 07.09.11 05:59
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Тебе надо не блокировать файл (просто завалиш ту другую прогу),


Если файл блокирован и прога его открывает не в режиме O_NONBLOCK то прога просто будет ждать момента снятия блокировки с файла, если файл открывается в режиме O_NONBLOCK то сама прога тут уже должна обрабатывать ошибку открытия EAGAIN.
С чего вдруг прога должна завалиться?
Re[2]: Монопольный доступ к файлу в С/C++
От: solo700  
Дата: 07.09.11 10:13
Оценка:
MZ>Тебе надо не блокировать файл (просто завалиш ту другую прогу), а правильно
MZ>обрабатывать ошибки при чтении и правильно это чтение делать.

Этого я и пытался добиться — обработать ошибки и не читать. Не получается. Если файл существует, не поврежден,
есть доступ к диску — он открывается в любом случае без ошибок. Максимум, что я могу получить это нулевые указатели
на таких функциях как fgets() — но в этом случае я не знаю — то ли достигнут конец файла, то ли первая прога почистила данные
— по ferror(f) не получаю ошибок. Поэтому и считаю, что лучше блокировать файл.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.