Столкнулся с такой проблемой. Есть cgi программка, написанная на Delphi, которая вызывается со странички на сайте. Программа эта должна вести log файл, но т.к. страничку могут одновременно открыть сразу n пользователей, то в один и тот же файл (TextFile) все сразу записать не смогут - он будет заблокирован тем, кто первый запустил программу.
Собственно вопрос: Есть ли способ доступа к файлу, чтобы программа дождалась пока он будет свободен для записи и только после этого писала в него данные.
Спасибо.
Блокировка текстовых файлов
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
- Сообщения: 20
- Зарегистрирован: 19 авг 2004, 14:12
- Откуда: Харьков
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Для этих целей можно использовать семафоры или мьютексы.
(см раздел Synchronization Functions в справке WinAPI).
Если кому-то надо записать что-то в файл, то пусть он создает семафор, если семафор создать не удается, то это коллизия. Надо выждать случайную паузу и попробовать еще раз. Если семафор создать удалось, то надо произвести запись и разрушить семафор.
Могу также предложить более производительное решение. Создать еще одно приложение - Лог-сервер. Пусть к нему можно обращаться через shared files, named pipes... или на худой конец по tcpip. Все экземпляры CGI-шек уже не ждут своей очереди, а пишут в пайп или сокет (если конечно логсервер есть в наличии). Если он есть, то он это поймает, и положит в буфер, а при заполнении буфера пусть скидывает на диск кусками. Ну как?
(см раздел Synchronization Functions в справке WinAPI).
Если кому-то надо записать что-то в файл, то пусть он создает семафор, если семафор создать не удается, то это коллизия. Надо выждать случайную паузу и попробовать еще раз. Если семафор создать удалось, то надо произвести запись и разрушить семафор.
Могу также предложить более производительное решение. Создать еще одно приложение - Лог-сервер. Пусть к нему можно обращаться через shared files, named pipes... или на худой конец по tcpip. Все экземпляры CGI-шек уже не ждут своей очереди, а пишут в пайп или сокет (если конечно логсервер есть в наличии). Если он есть, то он это поймает, и положит в буфер, а при заполнении буфера пусть скидывает на диск кусками. Ну как?
-
- Сообщения: 20
- Зарегистрирован: 19 авг 2004, 14:12
- Откуда: Харьков
Идеи хорошие! Спасибо! Буду пробовать.