Мир шел дальше. Автоинструменты и поставщики программного блока дистрибутива согласовывают различия в библиотеках и интерфейсах и корректируются по мере необходимости.
Это напоминает мне о, Выделяют На Сбросе. Когда файловая система использует эту функцию, вместо того, чтобы писать данные непосредственно в диск, это вычитает размер данных, которые будут записаны из счетчика свободного пространства диска и содержит данные в памяти до него, синхронизирующий системный вызов выполняется, или ядро решает сбросить грязные буферы.
В этом случае, если файл будет изменен одним процессом и будет открыт другим процессом, то последний процесс будет "видеть" неизмененный (или "старый", если Вы предпочтете), версия файла.
Конечно, вышеупомянутое являются теоретическими и зависят от различных факторов, и я сказал бы немного непредсказуемый - так как Вы не знаете точно, когда ядро идет, сбрасывают грязные страницы. Например, в Linux (поскольку можно также считать в разделе 15.3 из Понимания Ядра Linux), грязные страницы записаны в диск при следующих условиях:
Кэш страницы становится слишком полным, и необходимо больше страниц, или количество грязных страниц становится слишком большим.
Слишком много времени протекло, так как страница осталась грязной.
Процесс запрашивает все незаконченные изменения блочного устройства или конкретного файла быть сброшенными; это делает это путем вызова синхронизации (), fsync (), или fdatasync () системный вызов.
Эта опция, как известно, реализована в HFS +, XFS, Reiser4, ZFS, Btrfs и ext4 файловые системы.
То, что Вы описываете, точно кажется, что основное переименовывает для перезаписи файла.
Когда Вы переименовываете/перемещаете один файл сверху другого, старый файл является несвязанным. Значение файла все еще существует, но это больше не находится в дереве файловой системы. Таким образом старые приложения продолжат мочь получить доступ к файлу, пока они сохраняют его открытым. После того как все приложения закрыли старый файл, затем его на самом деле освобожденный на диске.
rename
системный вызов является атомарной операцией. Таким образом, чтобы сделать это Вы создали бы новый файл под другим именем и затем звонили бы rename
для переименования временного файла как того, Вы хотите заменить. Так как операция является атомарной, нет абсолютно никакого периода, где файл отсутствует. Это немедленно идет от старого файла до нового файла.
Отметьте, хотя это временный файл и заменяемый файл должно находиться на той же точке монтирования.
rename
вещь подкачки. Даже если такая 'функция OS', поскольку Вы говорите о существовавшем, программа, должна была бы все еще быть записана для использования в своих интересах этого также. Каково различие?
– Patrick
29.03.2012, 14:39
open
syscall или если необходимо сделать то, что Вы описываете вручную. $
– eudoxos
30.03.2012, 14:10
Как Patrick пишет, обычный способ сделать, это должно записать новую версию в отдельный файл и по окончании переименовать новую версию к старому имени файла, перезаписав его атомарно. Эту вторую операцию называют overwrite-rename.
ISO C требует rename
быть атомарным. От Открытых Спецификаций Основы Группы:
Если ссылка, названная новым аргументом, будет существовать, то это должно быть удалено и старо переименованный к новому. В этом случае ссылка, названная новой, должна остаться видимой к другим процессам в течение операции переименования и относиться к файлу, упомянутому новым или к старому, прежде чем операция началась.
Старые версии Mac OS X не имели атомарным, переименовывает; это по сообщениям фиксируется у Льва.
Btrfs, по-видимому, намеренно нарушает стандарт, не гарантируя атомарный, переименовывает, по причинам производительности. Однако overwrite-rename является все еще атомарным, который является всем, в чем Вы нуждаетесь с этой целью.
man 3p rename
говорит мне это rename
является действительно атомарным, и я предполагаю, что это предназначено для всех файловых систем Linux. И когда я прочитал первую статью, которую Вы связали, я все еще думаю, что Btrfs переименовывают операции, являются атомарными. ответ Read Fiximan
– hagello
27.07.2015, 15:17