Вспомнить всё: lock file
Aug. 29th, 2017 08:50 pmОсвежил в памяти, как нынче заблокировать доступ к файлу на уровне C API.
Linux (и, видимо, прочие юниксы): flock работает всегда, lockf - для файла, открытого на запись. fcntl, наверное, тоже.
В Windows это не портируется, там надо звать Windows API, которое несовместимо в этом месте с OpenSSL BIO. И из виндового HANDLE получить дескриптор файла как-то можно, но это танцы с бубном.
На практике интересен ещё атомарный rename. В Unix-подобных системах, видимо, он действительно атомарный, попутно нашёлся эпический тред про то, как эту атомарность в MacOS 10+ чинили 3 года. В Windows есть ReplaceFile со товарищи, тоже со своими особенностями, и помеченная как deprecated функция для работы через транзакционный механизм NTFS.
Как это всё работает на NFS, не знает примерно никто.
Видимо, наиболее простое по программированию решение всех этих задач - внешнее по отношению к файловой системе, типа именованных мьютексов.
Linux (и, видимо, прочие юниксы): flock работает всегда, lockf - для файла, открытого на запись. fcntl, наверное, тоже.
В Windows это не портируется, там надо звать Windows API, которое несовместимо в этом месте с OpenSSL BIO. И из виндового HANDLE получить дескриптор файла как-то можно, но это танцы с бубном.
На практике интересен ещё атомарный rename. В Unix-подобных системах, видимо, он действительно атомарный, попутно нашёлся эпический тред про то, как эту атомарность в MacOS 10+ чинили 3 года. В Windows есть ReplaceFile со товарищи, тоже со своими особенностями, и помеченная как deprecated функция для работы через транзакционный механизм NTFS.
Как это всё работает на NFS, не знает примерно никто.
Видимо, наиболее простое по программированию решение всех этих задач - внешнее по отношению к файловой системе, типа именованных мьютексов.
no subject
Date: 2017-08-29 09:12 pm (UTC)Честно говоря, если бы писал на голом C, то, наверное, не привязывался к файловой системе, а использовал семафор. Но я межпроцесску на сишке не писал со времен универа, так что мое мнение по рупь ведро.
NFS locking
Date: 2017-08-29 10:30 pm (UTC)Читать вопрос D10 в FAQ.
http://www.sqlite.org/faq.html#q5:
Можно для вдохновения почитать исходники flufl.lock.
Re: NFS locking
Date: 2017-08-30 08:29 am (UTC)no subject
Date: 2017-08-30 12:32 am (UTC)Под ДОС, Win95 и последующих виндах - неразрушающий rename атомарен и может использоваться для создания файловых флагов вполне надёжно.
На системе с хардлинками - создание хардлинка в проверенных мной случаях - атомарная операция.
А ещё бывают построенные вируталки с доступом на запись к диску. :)
no subject
Date: 2017-08-30 08:31 am (UTC)no subject
Date: 2017-08-30 12:34 am (UTC)Но разрушающий.
Это делает его юзабельность для многих задач минимальной. :(
no subject
Date: 2017-08-30 09:49 am (UTC)no subject
Date: 2017-08-30 01:12 pm (UTC)no subject
Date: 2017-08-30 02:24 pm (UTC)$ touch 2
$ mv 1 2
$ ls
2
$
при переименовании файл В который переименовывается - убивается, переименование успешно.
rename в unix C ведёт себя идентично.
в ДОС:
D:\> echo "">1
D:\> echo "">2
D:\> rename 1 2
Файл с таким именем уже существует
или не найден.
D:\> dir /b
1 2
D:\>
при переименовании наличие файла-мишени приводит к ошибке выполнения rename.