В табл. 15.2 подытожена информация о том, какие поля меток времени (а в ряде случаев и аналогичные поля родительского каталога) меняются различными системными вызовами и библиотечными функциями, описанными в данной книге. В шапке этой таблицы буквами a, m и c обозначены поля st_atime, st_mtime и st_ctime соответственно. В большинстве случаев для соответствующей метки времени с помощью системного вызова задается значение текущего времени. Исключение составляет системный вызов utime() и подобные ему вызовы (рассмотренные в подразделах 15.2.1 и 15.2.2), которые можно использовать для того, чтобы явно указать произвольные значения для времени последнего доступа к файлу и времени его изменения.
Таблица 15.2. Действие различных функций на метки времени
Функция
Файл или каталог
Родительский каталог
Примечания
a
m
c
a
m
c
chmod()
То же, что и для fchmod()
chown()
То же, что и для lchown() или fchown()
exec()
link()
*
*
*
Влияет на родительский каталог второго аргумента
mkdir()
*
*
*
*
*
mkfifo()
*
*
*
*
*
mknod()
*
*
*
*
*
mmap()
*
*
Метки st_mtime и st_ctime изменяются только при обновлениях флага MAP_SHARED
msync()
*
*
Меняется только при изменении файла
open(), creat()
*
*
*
*
*
При создании нового файла
open(), creat()
*
*
При усечении существующего файла
pipe()
*
*
*
read()
*
То же, что и для readv(), pread() или preadv()
readdir()
*
Функция readdir() может буферизовать записи каталога; метки времени обновляются только при чтении каталога
removexattr()
*
То же, что и для fremovexattr() или lremovexattr()
rename()
*
*
*
Влияет на метки времени в обоих родительских каталогах; в стандарте SUSv3 не закреплено изменение метки st_ctime для файла, однако следует отметить, что в некоторых реализациях это происходит
rmdir()
*
*
То же, что и для remove(directory)
sendfile()
*
Изменяется метка времени для входного файла
setxattr()
*
То же, что и для fsetxattr() или lsetxattr()
symlink()
*
*
*
*
*
Устанавливает метки времени для ссылки (а не для целевого файла)
truncate()
*
*
То же, что и для ftruncate(); метки времени меняются только при изменении размера файла
unlink()
*
*
*
То же, что и для remove(file); метка времени st_ctime файла меняется, если предыдущий счетчик ссылок был > 1
utime()
*
*
*
То же, что и для utimes(), futimes(), futimens(), lutimes() или utimensat()
write()
*
*
То же, что и для writev(), pwrite() или pwritev()
В подразделе 14.8.1 и разделе 15.5 описаны параметры системного вызова mount(2) и пофайловые флаги, предотвращающие обновление времени последнего доступа к файлу. Флаг O_NOATIME вызова open(), описанный в разделе 4.3.1, также служит подобной цели. В ряде приложений это может помочь повысить производительность, поскольку снижает количество дисковых операций, которые необходимы при доступе к файлу.
Несмотря на то что в большинстве систем UNIX не записывается время создания файла, в новейших BSD-системах это время заносится в структуру stat в поле st_birthtime.
Начиная с версии 2.6, Linux поддерживает наносекундную точность для трех полей с метками времени в структуре stat. Наносекундное разрешение повышает точность программ, которым необходимо принимать решения на основе относительного порядка следования меток времени файла (например, для команды make(1)).
В стандарте SUSv3 не предусмотрены наносекундные метки времени, эта спецификация добавлена в стандарт SUSv4.
Не все файловые системы поддерживают наносекундные метки времени. Файловые системы JFS, XFS, ext4 и Btrfs поддерживают их, а ext2, ext3 и Reiserfs — нет.