В классических файловых системах Unix ответ был бы «Нет» (то есть данные для созданного и удаленного файла не обязательно попадут на диск), хотя некоторые метаданные каталога (время модификации), вероятно, все же изменятся. Следовательно, происходящее частично зависит от используемой файловой системы.
Обратите внимание, что даже вызов sync()
не гарантирует, что они будут записаны; он только планирует запись данных обратно на диск. Отсюда древнее предписание дважды вводить команду sync
перед остановом системы — это давало компьютеру достаточно времени для завершения записи, потому что он может записывать на диск быстрее, чем вы дважды набираете sync
(особенно если вы используете настоящий компьютер). Телетайп со скоростью 110 бод).
Стандарт POSIX говорит (о функции sync()
, которая используется командой sync
):
Функция sync() должна запланировать запись всей информации в памяти, которая обновляет файловые системы, во все файловые системы.
Запись, хотя и запланированная, не обязательно завершается по возвращении из sync().
Если Linux изменил свое определение, чтобы гарантировать, что «все данные записываются на диск», то это правильное и полезное расширение. Но это не классическое поведение — и остерегайтесь переноса опыта Linux на другие системы.
Есть и другие функции, такие как fsync(), которые дают другие, более строгие обещания:
Функция fsync() должна запросить, чтобы все данные для дескриптора открытого файла, названного fildes, были переданы на устройство хранения, связанное с файлом, описанным fildes. Характер передачи определяется реализацией. Функция fsync() не должна возвращаться до тех пор, пока система не завершит это действие или пока не будет обнаружена ошибка.
И есть варианты файловых дескрипторов, которые опять дают другие обещания: O_SYNC, O_DSYNC, O_RSYNC. Найдите их в стандарте POSIX (open()
).
person
Jonathan Leffler
schedule
01.04.2009