В табл. 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 — нет.

Перейти на страницу:

Похожие книги