В классических файловых системах 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()
).