Pourquoi ma structure stat a-t-elle un champ st_mtim au lieu de st_mtime?

Pour mon cours d’informatique, nous implémentons la fonctionnalité “ls” dans un programme C et nous devons utiliser le champ st_mtime. Lorsque j’utilise struct stat, cependant, il ne contient qu’un champ st_mtim et non le champ st_mtime dont j’ai besoin. Cela correspond à ce que je vois dans le fichier d’en-tête dans /usr/include/sys/stat.h. Comment puis-je obtenir la définition de structure qui a le champ dont j’ai besoin?

J’ai regardé ça sur mon système (Debian).

Pour une raison quelconque, st_mtime est défini comme une macro; la définition est st_mtim .

Ignorez le contenu des en-têtes (ils sont plus utiles pour le compilateur que pour les lecteurs humains) et suivez simplement la documentation. man 2 stat vous indiquera les en-têtes à inclure, et au moins sur mon système, un exemple de programme.


Les détails gores (que vous n’avez pas besoin de savoir pour les utiliser correctement):

Dans /usr/include/bits/stat.h , le type struct stat est défini avec les membres suivants (entre autres):

 struct timespec st_atim; /* Time of last access. */ struct timespec st_mtim; /* Time of last modification. */ struct timespec st_ctim; /* Time of last status change. */ 

Une struct timespec est une structure qui contient, entre autres, un membre de type time_t appelé tv_sec . (Un autre membre permet des horodatages de résolution plus élevés.)

Ceci est suivi des directives de préprocesseur suivantes:

 # define st_atime st_atim.tv_sec # define st_mtime st_mtim.tv_sec # define st_ctime st_ctim.tv_sec 

Donc, vous pouvez simplement faire référence à foo.st_mtime dans votre propre code, et cela se développera en foo.st_mtim.tv_sec , qui est l’object time_t dont vous avez besoin.

MISE À JOUR :

Les déclarations de st_atim et al sont précédées (sur mon système Ubuntu 18.04 actuel) par ce commentaire:

 /* Nanosecond resolution timestamps are stored in a format equivalent to 'struct timespec'. This is the type used whenever possible but the Unix namespace rules do not allow the identifier 'timespec' to appear in the  header. Therefore we have to handle the use of this header in ssortingctly standard-compliant sources special. */ 

Sur mon Distro (Fedora), le st_time est défini comme une macro, comme ci-dessous lorsque l’heure de modification inclut les nanosecondes de l’heure de modification en utilisant la struct timespec

 $ grep -R st_mtim /usr/include .... /usr/include/bits/stat.h: struct timespec st_mtim /* Time of last modification. */ /usr/include/bits/stat.h:# define st_mtime st_mtim.tv_sec .... 

La macro est faite de manière à être rétrocompatible avec le champ st_time qui est documenté dans man fstat – utilisez-le simplement comme documenté ou utilisez la résolution complète du minuteur si vous voulez faire mieux que les secondes ….