Faire un time en nanosecondes avec stat !

Résolu/Fermé
shiklah - Modifié par mamiemando le 24/04/2016 à 10:49
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 24 avril 2016 à 11:36
Bonjour!

Mon but ici, est de comparer deux valeur (date de dernière modification) pour pouvoir faire un tri par date de mes fichiers (j'utilise une liste chaînée et une structure dans la quelle je stocke le résultat de
stat
).

(Je refais la fonction
ls
, donc ici l'option
-t
).

Le time_t st_mtime n'est pas assez précis pour moi. J'ai vu sur plusieurs forums (en anglais) qui'il y avait possibilité d'avoir un time en nanosecondes mais impossible de comprendre comment l'utiliser dans mon cas.

Si quelqu'un pouvait me mettre sur la voie ..

Merci !

A voir également:

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 24/04/2016 à 11:38
Bonjour,

Je n'ai pas vraiment compris ta question. D'après le man de
stat
, la fonction prend en paramètre :

int stat(const char *pathname, struct stat *buf);


... avec :

struct stat {
  dev_t     st_dev;         /* Périphérique                     */
  ino_t     st_ino;         /* Numéro d’inœud                   */
  mode_t    st_mode;        /* Protection                       */
  nlink_t   st_nlink;       /* Nombre de liens physiques        */
  uid_t     st_uid;         /* UID du propriétaire              */
  gid_t     st_gid;         /* GID du propriétaire              */
  dev_t     st_rdev;        /* Type de périphérique             */
  off_t     st_size;        /* Taille totale en octets          */
  blksize_t st_blksize;     /* Taille de bloc pour E/S          */
  blkcnt_t  st_blocks;      /* Nombre de blocs de 512 o alloués */

  /* Depuis Linux 2.6, le noyau permet une précision à la
  nanoseconde pour les champs temporels suivants. Pour
  plus de précisions avant Linux 2.6, consultez les NOTES. */

  struct timespec st_atim;  /* Heure dernier accès              */
  struct timespec st_mtim;  /* Heure dernière modification      */
  struct timespec st_ctim;  /* Heure dernier changement état    */

  #define st_atime st_atim.tv_sec      /* Rétrocompatibilité        */
  #define st_mtime st_mtim.tv_sec
  #define st_ctime st_ctim.tv_sec
};


... donc en gros les dates que tu récupères sont de type
struct timespec
ainsi définie :
https://pubs.opengroup.org/onlinepubs/007908775/xsh/time.h.html

Ce qui donne :

#include <errno.h>      // errno
#include <stdio.h>      // printf, fprintf
#include <stdlib.h>     // EXIT_*
#include <string.h>     // strerror
#include <sys/types.h>  // stat
#include <sys/stat.h>   // stat
#include <time.h>       // ctime
#include <unistd.h>     // stat

int main(int argc, char ** argv) {
    // Handle arguments
    if (argc != 2) {
        fprintf(stderr, "usage: %s filename\n", argv[0]);
        return EXIT_FAILURE;
    }
    
    const char * filename = argv[1];
    
    // Get stats
    struct stat result;
    if (stat(filename, &result) == 0) {
        printf("Last access of %s: %sns: %ld\n",
            filename,
            ctime(&result.st_atim.tv_sec),
            result.st_atim.tv_nsec
        );
    } else {
        fprintf(stderr, "%s: %s.\n", argv[0], strerror(errno));
    }   
    
    return EXIT_SUCCESS;
}


Ce qui donne par exemple :

(mando@velvet) (~) $ ./a.out /etc/fstab
Last access of /etc/fstab: Sat Apr 23 20:36:49 2016
ns: 236008608


Bonne chance
0