Как меняется ctime?

8

Я пытаюсь точно понять, когда метка времени ctime файла изменяется. Во многих местах (например, в принятом ответе здесь ) предполагается, что любое изменение атрибутов файла также изменит ctime. Однако, похоже, что это не так, по крайней мере, на моем Ubuntu 12.04 (да, я знаю, немного староват ...):

cat file.txt > /dev/null

изменяет atime, поэтому он изменяет атрибуты файла (в inode файла), но не меняет ctime.

Другие источники (например, здесь и здесь ) предполагают, что только некоторые операции над атрибутами файла фактически изменяют ctime, но точный список не предоставляется.

Где я могу найти точную ссылку на то, какие операции меняют ctime?

VeryHardCoder
источник
Может быть, проблема связана с тем cat, рассматривали ли вы это touch?
Махди

Ответы:

8

В системах Unix есть три метки времени:

  • atime: Время доступа

    Эта отметка времени сообщает вам, когда к файлу обращались в последний раз, включая доступ только для чтения.

  • ctime: Время смены

    Эта отметка времени сообщает вам, когда атрибуты файла (информация об узле) изменились в последний раз. Это включает в себя, например, владение и разрешения, но изменение содержимого также вызывает обновление этой отметки времени.

    Обратите внимание, что изменения в atime кажутся исключением, поскольку они не запускают обновление ctime. Вероятно, это связано с тем, что простой доступ для чтения, достаточный для запуска обновления времени, не вносит каких-либо соответствующих изменений в атрибуты файла. И одна из основных целей ctime - помочь инструментам резервного копирования определить, изменился ли файл. Atime - несущественная информация для таких инструментов, и обновление резервной копии просто для обновления измененного времени, потому что кто-то прочитал файл, будет бесполезным.

    Я не уверен, но некоторые люди думают, что это поведение (изменения atime не обновляют ctime) происходит только из-за параметров монтирования (например relatime) базовой файловой системы, которая кэширует и задерживает обновления atime в inode по соображениям производительности в памяти и только применяет их к реальным inode на диске (вызывая обновление ctime) при определенных условиях.
    @kos попробовал это сделать, и, видимо, даже при монтировании FS с опцией `strictatime`` ctime, похоже, никогда не обновится, если atime изменится.

  • mtime: Время модификации

    Эта отметка времени указывает, когда содержимое файла было изменено в последний раз.


Таким образом, простой доступ на чтение, использующий cat FILENAMEтолько atime , но не ctime, поскольку атрибут файла не был изменен. Измененная Atime не сосчитать.

Byte Commander
источник
В том-то и дело: почему измененное время не считается? Разве это не атрибут файла?
VeryHardCoder
@VeryHardCoder Я попытался уточнить свой ответ по этому вопросу и добавил некоторые пояснения.
Byte Commander