Scroll to navigation

utimensat(2) System Calls Manual utimensat(2)

NOM

utimensat, futimens - Modifier les horodatages d'un fichier avec une précision d'une nanoseconde

BIBLIOTHÈQUE

Bibliothèque C standard (libc-lc)

SYNOPSIS

#include <fcntl.h>          /* Définition des constantes AT_* */
#include <sys/stat.h>
int utimensat(int dirfd, const char *path,
              const struct timespec times[_Nullable 2], int flags);
int futimens(int fd, const struct timespec times[_Nullable 2]);

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros(7)) :

utimensat():


Depuis la glibc 2.10 :
_POSIX_C_SOURCE >= 200809L
avant la glibc 2.10 :
_ATFILE_SOURCE

futimens():


Depuis la glibc 2.10 :
_POSIX_C_SOURCE >= 200809L
Avant la glibc 2.10 :
_GNU_SOURCE

DESCRIPTION

utimensat() et futimens() mettent à jour les horodatages d'un fichier avec une précision d'une nanoseconde. Cela change de l'appel historique ou de utimes(2) qui permettent seulement une précision d'une seconde et d'une microseconde respectivement pour l'établissement des horodatages de fichier.

With utimensat() the file is specified via the pathname given in path. With futimens() the file whose timestamps are to be updated is specified via an open file descriptor, fd.

Pour les deux appels, les nouveaux horodatages de fichier sont indiqués dans le tableau times[0] : times indique l'horodatage du dernier accès (atime) ; times[1] indique l'horodatage de la dernière modification (mtime). Chaque élément de times indique une date par un nombre de secondes et de nanosecondes depuis l'époque POSIX (1er janvier 1970 à 00:00:00 UTC). Cette information est transmise dans une structure timespec(3).

Les horodatages de fichier mis à jour sont configurés à la valeur la plus importante gérée par le système de fichiers et qui n'est pas supérieure à l'horodatage fourni.

Si le champ tv_nsec d'une des structures timespec prend la valeur particulière UTIME_NOW, alors l'horodatage correspondant du fichier est défini à l'heure actuelle. Si le champ tv_nsec d'une des structures timespec prend la valeur particulière UTIME_OMIT, alors l'horodatage correspondant du fichier reste inchangé. Dans ces deux cas, la valeur du champ tv_sec est ignoré.

Si times est NULL, les deux horodatages sont définis à l'heure actuelle.

L'heure du changement d'état (ctime) sera réglée à l'heure actuelle, même si les autres horodatages ne sont pas vraiment modifiés.

Droits d'accès nécessaires

Pour définir les deux horodatages à l'heure actuelle (c'est-à-dire quand times vaut NULL ou que les deux champs tv_nsec valent UTIME_NOW), il faut :

  • soit que l'utilisateur ait les droits d'écriture sur le fichier ;
  • soit que l'identifiant effectif de l'appelant corresponde au propriétaire du fichier ;
  • ou bien que le processus appelant ait les privilèges nécessaires.

Pour pouvoir effectuer d'autres changements que de définir les horodatages à l'heure actuelle (c'est-à-dire quand times n'est pas NULL et que ni le champ tv_nsec ne vaut UTIME_NOW, ni le champ tv_nsec ne vaut UTIME_OMIT), les conditions 2 ou 3 ci-dessus s'appliquent.

Si les deux champs tv_nsec valent UTIME_OMIT, aucune vérification n'est effectuée sur le propriétaire ou les permissions et les horodatages ne sont pas modifiés, mais les autres situations d'erreur sont toujours détectées.

Spécificités de utimensat()

If path is relative, then by default it is interpreted relative to the directory referred to by the open file descriptor, dirfd (rather than relative to the current working directory of the calling process, as is done by utimes(2) for a relative pathname). See openat(2) for an explanation of why this can be useful.

If path is relative and dirfd is the special value AT_FDCWD, then path is interpreted relative to the current working directory of the calling process (like utimes(2)).

Si path est absolu, alors dirfd est ignoré.

Le paramètre flags est un masque de bits créé par un OU binaire entre zéro ou plus des valeurs suivantes définies dans <fcntl.h> :

If path is an empty string, operate on the file referred to by dirfd (which may have been obtained using the open(2) O_PATH flag). In this case, dirfd can refer to any type of file, not just a directory. If dirfd is AT_FDCWD, the call operates on the current working directory. This flag is Linux-specific; define _GNU_SOURCE to obtain its definition.
If path specifies a symbolic link, then update the timestamps of the link, rather than the file to which it refers.

VALEUR RENVOYÉE

S'ils réussissent, les appels utimensat() et futimens() renvoient zéro, sinon ils renvoient -1 et errno est défini pour indiquer l'erreur.

ERREURS

times vaut NULL ou les deux champs tv_nsec valent UTIME_NOW et l'identifiant de l'utilisateur effectif de l'appelant ne correspond pas au propriétaire du fichier, l'appelant n'a pas la permission d'écriture sur le fichier et l'appelant n'est pas privilégié (sous Linux : n'a ni la capacité CAP_FOWNER, ni la capacité CAP_DAC_OVERRIDE).
(futimens()) fd n'est pas un descripteur de fichier valable.
(utimensat()) path is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.
times pointed to an invalid address; or, dirfd was AT_FDCWD, and path is NULL or an invalid address.
Valeur incorrecte dans flags.
Valeur incorrecte dans un des champs tv_nsec (valeur en dehors de l'intervalle allant de 0 à 999 999 999 et ne valant ni UTIME_NOW, ni UTIME_OMIT) ; ou une valeur incorrecte dans un des champs tv_sec.
path is NULL, dirfd is not AT_FDCWD, and flags contains AT_SYMLINK_NOFOLLOW.
(utimensat()) Too many symbolic links were encountered in resolving path.
(utimensat()) path is too long.
(utimensat()) A component of path does not refer to an existing directory or file, or path is an empty string.
(utimensat()) path is relative, but dirfd is neither AT_FDCWD nor a file descriptor referring to a directory; or, one of the prefix components of path is not a directory.
L'appelant a essayé de modifier un horodatage (ou les deux) en une valeur autre que l'heure actuelle ou de modifier un des horodatages en l'heure actuelle sans changer l'autre horodatage (c'est-à-dire times n'est pas NULL, aucun des deux champs tv_nsec ne vaut UTIME_NOW et aucun des deux champs tv_nsec ne vaut UTIME_OMIT) et :
  • l'identifiant d'utilisateur effectif de l'appelant ne correspond pas au propriétaire du fichier et l'appelant n'est pas privilégié (sous Linux : n'a pas la capacité CAP_FOWNER) ; ou,
  • le fichier est marqué comme n'acceptant que des ajouts ou est immuable (voir chattr(1)).
Le fichier se trouve sur un système de fichiers en lecture seule.
(utimensat()) Search permission is denied for one of the prefix components of path.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes(7).

Interface Attribut Valeur
utimensat(), futimens() Sécurité des threads MT-Safe

VERSIONS

Différences entre la bibliothèque C et l'ABI du noyau

On Linux, futimens() is a library function implemented on top of the utimensat() system call. To support this, the Linux utimensat() system call implements a nonstandard feature: if path is NULL, then the call modifies the timestamps of the file referred to by the file descriptor dirfd (which may refer to any type of file). Using this feature, the call futimens(fd, times) is implemented as:


utimensat(fd, NULL, times, 0);

Note, however, that the glibc wrapper for utimensat() disallows passing NULL as the value for path: the wrapper function returns the error EINVAL in this case.

STANDARDS

POSIX.1-2008.

VERSIONS

Linux 2.6.22, glibc 2.6. POSIX.1-2008.
glibc 2.6. POSIX.1-2008.

NOTES

utimensat() rend futimesat(2) obsolète.

Sous Linux, les horodatages ne peuvent pas être modifiés pour un fichier marqué comme étant immuable, et la seule modification autorisée pour les fichiers n'autorisant que des ajouts est de définir les horodatages à l'heure actuelle. C'est cohérent avec le comportement historique de utime(2) et de utimes(2) sous Linux

If both tv_nsec fields are specified as UTIME_OMIT, then the Linux implementation of utimensat() succeeds even if the file referred to by dirfd and path does not exist.

BOGUES

Plusieurs bogues affectent utimensat() et futimens() avant Linux 2.6.26. Ces bogues sont soit des non conformités avec le brouillon de la spécification POSIX.1, soit des incohérences avec le comportement historique de Linux.

  • POSIX.1 spécifie que si un des champs tv_nsec prend la valeur UTIME_NOW ou UTIME_OMIT, alors la valeur du champs tv_sec correspondant doit être ignorée. À la place, la valeur du champ tv_sec doit être nulle (ou une erreur EINVAL sera produite).
  • Ces bogues indiquent que pour ce qui est de la vérification des droits, le cas où les deux champs tv_nsec ne valent pas UTIME_NOW n'est pas toujours traité de la même façon que lorsque times est NULL, et le cas où une des valeurs tv_nsec vaut UTIME_NOW et l'autre vaut UTIME_OMIT n'est pas traité de la même façon que quand times pointe vers un tableau de structures contenant des valeurs de temps arbitraires. De ce fait, il se peut que : a) des horodatages de fichier puissent être mis à jour par un processus qui ne devrait pas avoir le droit de faire ces mises à jour ; b) des horodatages de fichier ne puissent pas être mis à jour par un processus qui devrait avoir le droit de faire ces mises à jour ; et c) la mauvaise valeur d'errno puisse être renvoyée en cas d'erreur.
  • POSIX.1 indique qu'un processus qui a les droits d'accès en écriture pour un fichier peut faire un appel avec times valant NULL ou avec times pointant vers un tableau de structures dans lesquelles les deux champs tv_nsec valent UTIME_NOW pour mettre à jour les deux horodatages à l'heure actuelle. Cependant, futimens() vérifie à la place si le mode d'accès du descripteur de fichier permet l'écriture.

VOIR AUSSI

chattr(1), touch(1), futimesat(2), openat(2), stat(2), utimes(2), futimes(3), timespec(3), inode(7), path_resolution(7), symlink(7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.

17 mai 2025 Pages du manuel de Linux (non publiées)