Обратите внимание, что это не дубликат File r/w locking and unlink. (Разностная платформа. Операции с файлами, такими как блокировка и удаление, имеют совершенно другую семантику, поэтому султу будет отличаться).Разблокировка и удаление файлов как одна операция
У меня есть следующая проблема. Я хочу создать хранилище сеансов на основе файловой системы, где каждый файл сеанса хранится в простом файле с идентификаторами сеанса.
Я хочу следующего API: write(sid,data,timeout)
, read(sid,data,timeout)
, remove(sid)
где с.и.д. == имя файла Также я хочу, чтобы иметь какие-то GC, который может удалить все тайм-аут сессии.
Довольно простая задача, если вы работаете с одним процессом, но абсолютно не тривиальны при работе с несколькими процессами или даже с общими папками.
Самое простое решение, которое я думал только о том:
write/read:
hanlde=CreateFile
LockFile(handle)
read/write data
UnlockFile(handle)
CloseHanlde(handle)
GC (for each file in directory)
hanlde=CreateFile
LockFile(handle)
check if timeout occured
DeleteFile
UnlockFile(handle)
CloseHanlde(handle)
Но AFIAK я не могу назвать DeleteFile
на opended заблокированный файл (в отличие от Unix, где файл блокировки не является обязательным и UNLINK допускается для открытых файлов.
Но если я ставлю DeleteFile
вне фиксирующих петли плохой сценарий может произойти
GC - CreateFile/LockFile/Unlock/CloseHandle,
write - oCreateFile/LockFile/WriteUpdatedData/Unlock/CloseHandle
GC - DeleteFile
Кто-нибудь знает, как решить эту проблему? Есть ли какие-либо трюки, которые позволяют объединить блокировку файла и удалить файл или выполнить операцию с файлом atom (Win32)?
Примечания:
- Я не хочу использовать базу данных,
- я искать решение для Win32 API для NT 5.01 и выше
Спасибо.
Наверное, это выглядит как обман. Пожалуйста, объясните различия, или это может быть закрыто. – 2009-12-19 14:07:39
Добавлено explenation - POSIX и Win32 требовали совершенно разных решений – Artyom