Блокировка текстовых файлов

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Пацак с планеты Земля
Сообщения: 20
Зарегистрирован: 19 авг 2004, 14:12
Откуда: Харьков

Столкнулся с такой проблемой. Есть cgi программка, написанная на Delphi, которая вызывается со странички на сайте. Программа эта должна вести log файл, но т.к. страничку могут одновременно открыть сразу n пользователей, то в один и тот же файл (TextFile) все сразу записать не смогут - он будет заблокирован тем, кто первый запустил программу.
Собственно вопрос: Есть ли способ доступа к файлу, чтобы программа дождалась пока он будет свободен для записи и только после этого писала в него данные.

Спасибо.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Для этих целей можно использовать семафоры или мьютексы.
(см раздел Synchronization Functions в справке WinAPI).

Если кому-то надо записать что-то в файл, то пусть он создает семафор, если семафор создать не удается, то это коллизия. Надо выждать случайную паузу и попробовать еще раз. Если семафор создать удалось, то надо произвести запись и разрушить семафор.

Могу также предложить более производительное решение. Создать еще одно приложение - Лог-сервер. Пусть к нему можно обращаться через shared files, named pipes... или на худой конец по tcpip. Все экземпляры CGI-шек уже не ждут своей очереди, а пишут в пайп или сокет (если конечно логсервер есть в наличии). Если он есть, то он это поймает, и положит в буфер, а при заполнении буфера пусть скидывает на диск кусками. Ну как?
Пацак с планеты Земля
Сообщения: 20
Зарегистрирован: 19 авг 2004, 14:12
Откуда: Харьков

Идеи хорошие! Спасибо! Буду пробовать.
Ответить