utimensat(2) | System Calls Manual | utimensat(2) |
utimensat, futimens - изменение временных меток файла с наносекундной точностью
Standard C library (libc, -lc)
#include <fcntl.h> /* определения констант AT_* */ #include <sys/stat.h>
int utimensat(int dirfd, const char *pathname, const struct timespec times[_Nullable 2], int flags); int futimens(int fd, const struct timespec times[_Nullable 2]);
utimensat():
Начиная с glibc 2.10: _POSIX_C_SOURCE >= 200809L До glibc 2.10: _ATFILE_SOURCE
futimens():
Начиная с glibc 2.10: _POSIX_C_SOURCE >= 200809L До glibc 2.10: _BSD_SOURCE
Вызовы utimensat() и futimens() обновляют временные метки файла с наносекундной точностью. Этим они отличаются от utime(2) и utimes(2), которые имеют секундную и микросекундную точность, соответственно.
В вызове utimensat() файл задаётся в pathname по имени. В вызове futimens() файл указывается в виде открытого файлового дескриптора в fd.
For both calls, the new file timestamps are specified in the array times: times[0] specifies the new "last access time" (atime); times[1] specifies the new "last modification time" (mtime). Each of the elements of times specifies a time as the number of seconds and nanoseconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). This information is conveyed in a timespec(3) structure.
Обновлённые временные метки файла устанавливаются в самое большое значение, поддерживаемое файловой системой, но не больше чем указанное время.
Если в поле tv_nsec одной из структур timespec указано специальное значение UTIME_NOW, то соответствующая временная метка файла устанавливается в значение текущего времени. Если в поле tv_nsec одной из структур timespec указано специальное значение UTIME_OMIT, то соответствующая временная метка файла не изменяется. В обоих случаях значение поля tv_sec игнорируется.
Если значение times равно NULL, то значение обеих временных меток становится равным текущему времени.
The status change time (ctime) will be set to the current time, even if the other time stamps don't actually change.
Чтобы установить временные метки файла равными текущему времени (т.е., значение times равно NULL, или оба значения поля tv_nsec равно UTIME_NOW) требуется одно из:
Чтобы установить временные метки файла равными не текущему времени (т. е., значение times не равно NULL, или оба значения поля tv_nsec не равны UTIME_NOW или UTIME_OMIT) требуется выполнение условия 2 или 3.
Если в обоих значениях поле tv_nsec равно UTIME_OMIT, то проверки владения файлом и права доступа к нему не выполняются, и временные метки файла не изменяются, но всё равно могут проверяться другие условия возникновения ошибок.
Если в pathname указано относительное значение имени, то по умолчанию оно отсчитывается от каталога, на который ссылается открытый файловый дескриптор, dirfd (а не от текущего рабочего каталога вызывающего процесса, как это делается в utimes(2) для относительных имён). В openat(2) объяснено почему это может быть полезно.
Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как utimes(2)).
Если в pathname задан абсолютный путь, то dirfd игнорируется.
Значение поля flags представляет собой битовую маску и может равняться 0 или содержать следующую константу (определена в <fcntl.h>):
При успешном выполнении utimensat() и futimens() возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.
utimensat() was added in Linux 2.6.22; glibc support was added with glibc 2.6.
Поддержка futimens() появилась в glibc 2.6.
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
utimensat(), futimens() | Безвредность в нитях | MT-Safe |
Вызовы futimens() и utimensat() определены в POSIX.1-2008.
Вызов utimensat() заменяет устаревший futimesat(2).
В Linux, временные метки нельзя изменять у файлов, помеченных как неизменяемые (immutable), а у файлов, помеченных как только для добавления, можно изменить метку только на значение текущего времени (это соответствует сложившемуся исторически поведению в Linux вызовов utime(2) и utimes(2)).
Если оба поля tv_nsec равны UTIME_OMIT, то вызов utimensat() реализации Linux завершается без ошибки, даже, если файл, на который ссылается dirfd и pathname, не существует.
В Linux, futimens() представляет собой библиотечную функцию на основе системного вызова utimensat(). Для этого в Linux-версии системного вызова utimensat() реализовано нестандартное свойство: если значение pathname равно NULL, то вызов изменяет временные метки файла на который ссылается файловый дескриптор dirfd (который может указывать на файл любого типа). С помощью этого свойства вызов futimens(fd, times) реализован как:
utimensat(fd, NULL, times, 0);
Однако заметим, что обёрточная функция glibc для utimensat() не позволяет передачу NULL в качестве значения pathname — в этом случае возвращается ошибка EINVAL.
Several bugs afflict utimensat() and futimens() before Linux 2.6.26. These bugs are either nonconformances with the POSIX.1 draft specification or inconsistencies with historical Linux behavior.
chattr(1), touch(1), futimesat(2), openat(2), stat(2), utimes(2), futimes(3), timespec(3), inode(7), path_resolution(7), symlink(7)
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy Ovchinnikov <dmitriyxt5@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
12 февраля 2023 г. | Linux man-pages 6.03 |