Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       utimensat, futimens - изменение временных меток файла с наносекундной точностью

LIBRARY

       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]);

   Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

       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, то проверки владения файлом и права
       доступа к нему не выполняются, и временные метки файла не изменяются, но всё  равно  могут
       проверяться другие условия возникновения ошибок.

   Особенности utimensat()
       Если в pathname указано относительное значение имени, то по умолчанию оно отсчитывается от
       каталога, на который ссылается открытый файловый  дескриптор,  dirfd  (а  не  от  текущего
       рабочего  каталога  вызывающего  процесса,  как это делается в utimes(2) для относительных
       имён). В openat(2) объяснено почему это может быть полезно.

       Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD,  то
       pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как
       utimes(2)).

       Если в pathname задан абсолютный путь, то dirfd игнорируется.

       Значение поля flags представляет собой битовую маску и может  равняться  0  или  содержать
       следующую константу (определена в <fcntl.h>):

       AT_SYMLINK_NOFOLLOW
              Если  pathname  указывает  на  символьную  ссылку,  то  обновляются временные метки
              ссылки, а не файла, на который она ссылается.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При успешном выполнении utimensat() и futimens() возвращается 0. При  ошибке  возвращается
       -1, а в errno содержится код ошибки.

ОШИБКИ

       EACCES times  is  NULL, or both tv_nsec values are UTIME_NOW, and the effective user ID of
              the caller does not match the owner of the file, the caller  does  not  have  write
              access  to  the file, and the caller is not privileged (Linux: does not have either
              the CAP_FOWNER or the CAP_DAC_OVERRIDE capability).

       EBADF  (futimens()) Значение fd не является правильным файловым дескриптором.

       EBADF  (utimensat()) В pathname содержится относительный путь, но значение dirfd не  равно
              AT_FDCWD и не является правильным файловым дескриптором.

       EFAULT Значение times указывает на некорректный адрес; или dirfd равно AT_FDCWD и pathname
              равно NULL или содержит некорректный адрес.

       EINVAL Некорректное значение flags.

       EINVAL Invalid value in one of the tv_nsec fields (value outside range  [0,  999,999,999],
              and not UTIME_NOW or UTIME_OMIT); or an invalid value in one of the tv_sec fields.

       EINVAL Значение   pathname   равно   NULL,  dirfd  не  равно  AT_FDCWD  и  flags  содержит
              AT_SYMLINK_NOFOLLOW.

       ELOOP  (utimensat()) Во время определения pathname встретилось  слишком  много  символьных
              ссылок.

       ENAMETOOLONG
              (utimensat()) Слишком длинное значение аргумента pathname.

       ENOENT (utimensat())  Компонент  пути  pathname  не  ссылается на существующий каталог или
              файл, или в pathname указана пустая строка.

       ENOTDIR
              (utimensat()) В pathname содержится относительный путь, но значение dirfd не  равно
              AT_FDCWD или не является файловым дескриптором, ссылающимся на каталог; или один из
              компонентов pathname не является каталогом.

       EPERM  Вызывающий пытается изменить одну или обе временные метки на значение, отличное  от
              текущего  времени,  или изменить одну из временных меток на текущее время, а другую
              оставить неизменной (т. е., значение times не равно NULL,  у  обоих  значений  поле
              tv_nsec не равно UTIME_NOW, и у обоих значений поле tv_nsec не равно UTIME_OMIT) и:

              •  эффективный   пользовательский  идентификатор  не  совпадает  с  идентификатором
                 владельца файла, а вызывающий не  имеет  привилегий  (Linux:  не  имеет  мандата
                 CAP_FOWNER);

              •  файл помечен как только для добавления или как неизменяемый (см. chattr(1)).

       EROFS  Файл расположен в файловой системе, доступной только для чтения.

       ESRCH  (utimensat()) В одном из каталогов префикса pathname не разрешён поиск.

ВЕРСИИ

       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, не существует.

   Отличия между библиотекой C и ABI ядра
       В  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.

       •  В POSIX.1 определено, что если в  одном  из  значений  времени  поле  tv_nsec  содержит
          значение  UTIME_NOW  или  UTIME_OMIT,  то  значение соответствующего поля tv_sec должно
          игнорироваться. Вместо этого требуется, чтобы значение поля tv_sec равнялось  0  (иначе
          выдаётся ошибка EINVAL).

       •  Различные дефекты возникают при рассмотрении имеющихся прав и значений: случай, когда у
          обоих значений поле tv_nsec равно UTIME_NOW, не всегда рассматривается равным  указанию
          в  times значения NULL, и случай, когда одно значение tv_nsec равно UTIME_NOW, а другое
          — UTIME_OMIT, не рассматривается равным указанию в times указателя на массив  структур,
          содержащий  произвольные  значения  времени.  В  результате  в  некоторых  случаях:  а)
          временные метки файлов могут быть обновлены процессом, который не имеет прав на это; б)
          временные  метки  файлов не могут быть обновлены процессом, хотя он имеет на это право;
          в) в случае ошибки возвращается неправильное значение в errno.

       •  В POSIX.1 сказано, что процесс имеющий права на запись в файл, для установки  временных
          меток  в  текущее  время  может  выполнить  вызов со значением times равным NULL, или с
          times, указывающим на массив структур, в котором у обоих значений времени поле  tv_nsec
          равно  UTIME_NOW.  Однако futimens() вместо этого проверяет права на запись у файлового
          дескриптора.

СМ. ТАКЖЕ

       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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.