Запись в файл из нескольких процессов
От: DeaD MoroZ Россия  
Дата: 24.09.03 09:04
Оценка:
Ситуация такая: в приложении необходимо вести журнал протоколов (логи).
Но беда в том, что одновременно может быть запущено несколько экземпляров приложения.

Протоколирование ведётся с использованием класса CFile.
Каждый процесс сначала открывает файл c флажками CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareDenyNone.

При записи происходит переход в конец файла с помощью функции SeekToEnd() и потом уже осуществляется запись.
Синхронизацию сделал на основе именованного мьютекса. Никто записывать одновременно не может.

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

Вызов функции Flush() после записи не помогает.

Подскажите пожалуйста, если кто знает как это исправить.
Re: Запись в файл из нескольких процессов
От: Chervinsky Украина www.is.svitonline.com/sashko1
Дата: 24.09.03 10:48
Оценка:
Здравствуйте, DeaD MoroZ, Вы писали:

DM>Ситуация такая: в приложении необходимо вести журнал протоколов (логи).

DM>Но беда в том, что одновременно может быть запущено несколько экземпляров приложения.
...

DM>Подскажите пожалуйста, если кто знает как это исправить.


ИМХО вы пытаетесь найти корректное решение для некорректной задачи. Разные экземпляры даже одного приложения — уже разные приложения. У каждого из них должен быть свой лог. А если куча приложений пишет в один лог, там наверняка будет такой салат, что ценность лога приближается к нулю.

Сашко.
У кого-то варит голова, у кого-то — желудок...
Re[2]: Запись в файл из нескольких процессов
От: DeaD MoroZ Россия  
Дата: 24.09.03 13:28
Оценка:
Здравствуйте, Chervinsky, Вы писали:

C> ИМХО вы пытаетесь найти корректное решение для некорректной задачи. Разные экземпляры даже одного приложения — уже разные приложения. У каждого из них должен быть свой лог. А если куча приложений пишет в один лог, там наверняка будет такой салат, что ценность лога приближается к нулю.


C>Сашко.


На самом деле есть несколько приложений, который используют одну DLL'ку. DLL'ка как раз и ведёт лог.
Я не считаю что там будет салат, если реализовать корректную запись. Нечто подобное у меня уже реализовано — просто я столкнулся с проблемой, решив которую всё будет супер.
Re: Запись в файл из нескольких процессов
От: Demon Россия  
Дата: 24.09.03 14:13
Оценка:
Здравствуйте, DeaD MoroZ, Вы писали:


DM>Ситуация такая: в приложении необходимо вести журнал протоколов (логи).

DM>Но беда в том, что одновременно может быть запущено несколько экземпляров приложения.

DM>Протоколирование ведётся с использованием класса CFile.

DM>Каждый процесс сначала открывает файл c флажками CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareDenyNone.

DM>При записи происходит переход в конец файла с помощью функции SeekToEnd() и потом уже осуществляется запись.

DM>Синхронизацию сделал на основе именованного мьютекса. Никто записывать одновременно не может.

DM>Проблема заключается в том, что после того, как в файл что-нибудь записал первый процесс, а потом второй,

DM>то при записи в файл опять первым процессом затирается то, что записал второй, т.е. SeekToEnd() как-бы не срабатывает.

DM>Вызов функции Flush() после записи не помогает.

Flush — Flushes any data yet to be written.
т.е. при этом не происходит обновление информации о файле, которая хранится в CFile

DM>Подскажите пожалуйста, если кто знает как это исправить.

каждый раз открывать/закрывать файл. Как показывает практика, на скорости это не сильно отражается.
Re[3]: Запись в файл из нескольких процессов
От: migel  
Дата: 24.09.03 15:15
Оценка:
Здравствуйте, DeaD MoroZ, Вы писали:


DM>Я не считаю что там будет салат, если реализовать корректную запись. Нечто подобное у меня уже реализовано — просто я столкнулся с проблемой, решив которую всё будет супер.

Ну дык блокируй файл на запись и/или разруливай мьютексами доступ к телу.
Re[4]: Запись в файл из нескольких процессов
От: DeaD MoroZ Россия  
Дата: 24.09.03 15:35
Оценка:
Здравствуйте, migel, Вы писали:

M>Ну дык блокируй файл на запись и/или разруливай мьютексами доступ к телу.


Блин.. да проблема не в этом. Доступ я разграничил и никто одновременно не пишет в файл.


Цитирую кусок из описания проблемы:
Проблема заключается в том, что после того, как в файл что-нибудь записал первый процесс, а потом второй,
то при записи в файл опять первым процессом затирается то, что записал второй, т.е. SeekToEnd() как-бы не срабатывает.
Re: Запись в файл из нескольких процессов
От: dionisdn  
Дата: 26.09.03 15:24
Оценка:
Здравствуйте, DeaD MoroZ.

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

Используй флажок CFile::shareExclusive при открытии файла.
... << RSDN@Home 1.0 beta 7a >>
Re[5]: Запись в файл из нескольких процессов
От: migel  
Дата: 26.09.03 18:27
Оценка:
Здравствуйте, DeaD MoroZ, Вы писали:
DM>Цитирую кусок из описания проблемы:
DM>Проблема заключается в том, что после того, как в файл что-нибудь записал первый процесс, а потом второй,
DM>то при записи в файл опять первым процессом затирается то, что записал второй, т.е. SeekToEnd() как-бы не срабатывает

Переоткрывай файл Ж-(.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.