Несколько предыдущих дней я искал и задавал несколько вопросов о файле с разными временными метками.
Теперь я знаю, что могу получить creation time
с помощью statx(2)
и изменить only
один из last (status change | modification | access) time
файлов, не меняя других раз, с помощью touch -m
и debugfs
команд/утилит.
Я хочу знать, как я могу изменить каждый last (status change | modification | access) time
, не меняя другое время only by system call
ни с помощью какой-либо команды/утилиты. Если это невозможно, то как эти команды/утилиты это делают?
Я знаю Criticism of atime.
Функция POSIX для задания: futimen()
и его близкий родственник futimensat()
:
#include <sys/stat.h>
int futimens(int fd, const struct timespec times[2]);
В частности, они поддерживают специальное значение времени UTIME_OMIT
, указывающее «не изменять это поле времени».
Эти функции используют struct timespec
, у которого есть поле tv_nsec
для записи наносекунд. Существует более старая, но, вероятно, более широко доступная функция utimes()
, которая использует значения struct timeval
и обеспечивает tv_usec
для записи микросекунд.
Эти функции позволяют установить время доступа (a-time) и время модификации (m-time); они не позволяют вам установить время «изменения статуса» (c-time). Не существует простого способа установить время c — оно автоматически обновляется файловой системой до текущего времени. См. Установка временных меток создания или изменения на Stack Overflow для обсуждения возможностей. Установка системного времени, изменение файла и сброс системного времени — ужасное «решение», если системой пользуются несколько пользователей. Это не очень привлекательное «решение», даже если вы единственный человек, использующий машину. .