9
votes

Comment puis-je obtenir le MTIME haute RES pour un lien symbolique à Perl?

Je veux reproduire la sortie de LS --Full-Time à partir d'un script Perl pour éviter les frais généraux d'appel LS plusieurs milliers de fois. J'espérais utiliser le STAT Fonction et saisissez toutes les informations de là. Cependant, l'horodatage de la sortie LS utilise l'horloge haute résolution afin qu'il inclue également le nombre de nanosecondes également (selon les documents GNU, cela est parce que le temps est équivalent à - format = long - -Te -time-style = intégral-iso et le style horaire complet comprend les nanosecondes).

J'ai rencontré TIME :: Embauche Module, qui remplace la fonction STAT STAT. Avec celui qui retourne ATime / MTTIME / CTime sous forme de chiffres de points flottants, mais il n'y a pas de remplacement pour lstat . Ceci est un problème, car appelant Stat sur un Symlink renvoie des informations pour le fichier lié, non pour le lien lui-même.

Donc, ma question est la suivante: où puis-je trouver une version de lstat qui retourne ATime / MTTIME / CTime de la même manière que le temps :: embauche :: stat? À défaut, existe-t-il une autre façon d'obtenir le modTime pour un lien symbolique en haute résolution (autre que d'appeler LS).


1 commentaires

Avez-vous besoin d'une solution portable ou existe-t-il juste un système d'exploitation ciblé?


4 Réponses :


2
votes

Votre meilleur pari serait de demander lstat à ajouter à TEMPS :: Embauche . En fait, vous pourriez probablement le faire vous-même. Je parierais que tout ce que vous avez à faire est de copier la fonction qui commence xxx

dans hires.xs , modifier stat (...) < / code> à lstat (...) & op_stat to op_lstat , ajouter lstat à @ Export_ok dans hire.pm et recompiler. Puis soumettez un patch afin que les autres puissent bénéficier.


1 commentaires

Changer OP_Stat à op_lstat ne fonctionnerait pas comme PL_PPADDR [op_lstat] est identique à PL_PPADDR [op_stat] car Perl_pp_lstat est implémenté en interne par Perl_PP_Stat ... mais +1 pour le fait que votre réponse m'a donné une idée de la façon de vous approcher du problème.



3
votes

Si vous êtes prêt à utiliser Inline :: C, cela fonctionnera avec les récents Linux

#!/usr/bin/perl

use strict;
use warnings;

use Inline C => <<'EOC';

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

long mtime_nsec(char* fname)
{
    struct stat st;
    if (-1 == lstat(fname, &st))
        return -1;
    return (long)st.st_mtim.tv_nsec;
}
EOC

print mtime_nsec($ARGV[0]);


0 commentaires

1
votes

Les changements suivants fonctionnent. Cela contient essentiellement des modifications du module Hires.PM ainsi que du fichier XS.

dans les locations.pm xxx

a également ajouté LSTAT à @export_ok Liste.

dans les embauches. xs xxx


2 commentaires

Avez-vous envoyé un correctif à RT ?


@Bradgilbert - Pas encore. J'ai également trouvé un autre moyen de terminer ce changement entièrement dans le fichier XS. décider toujours quelle serait la meilleure option



2
votes

pour l'enregistrement, lstat a été ajouté à la version 1.9726 de Time-Hires version 1.9726 en août 2013.

voir https://rt.can.org/public/bug /Display.html?id=83356 pour plus de détails.

Cependant, c'est toujours 1.9725 inclus dans la dernière version stable de Perl à partir de 2014-01-31 (5.18.2). Il a été heurté à 1,9726 dans la version de développement en 5.19.3 cependant.

Notez que (à partir de perl 5.19.8), que ce que heure :: embauche 's lstat est utilisé ou non, -M de Perl / -A / -c ne fait toujours pas la granularité sous-seconde (fichiers avec le temps dans la même seconde sera montré comme ayant le même âge), vous ne pouvez toujours pas faire des choses comme trier {-m $ A <=> -M $ b} @files pour trier les fichiers par Heure de modification.


2 commentaires

À partir de Perl 5.22 (Cygwin) et 5.16 (RHEL 7.2), je vois des différences dans la 6ème décimale de la partie Sous-seconde renvoyée par TIME :: Embauche :: State < / code> et la valeur renvoyée par le C bibliothèque STAT fonction. Cela provoque des différences dans les horodaques signalées par Perl et Recherche -Printf% TS , par exemple.


Cela pourrait être lié à Perl représentant l'horodatage comme un seul numéro de point flottant par rapport à la bibliothèque C en tant que deux entiers.