Je veux reproduire la sortie de 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 a >. 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. P>
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). P> LS --Full-Time code> à partir d'un script Perl pour éviter les frais généraux d'appel
LS code> 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 code> et le style horaire complet comprend les nanosecondes). P>
4 Réponses :
Votre meilleur pari serait de demander dans lstat code> à 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
hires.xs code>, modifier
stat (...) < / code> à
lstat (...) code> &
op_stat code> to
op_lstat code>, ajouter
lstat code> à
@ Export_ok code> dans
hire.pm code> et recompiler. Puis soumettez un patch afin que les autres puissent bénéficier. P> p>
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.
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]);
Les changements suivants fonctionnent. Cela contient essentiellement des modifications du module Hires.PM ainsi que du fichier XS.
dans les locations.pm strong> p> a également ajouté LSTAT à @export_ok Liste. P>
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
pour l'enregistrement, voir https://rt.can.org/public/bug /Display.html?id=83356 pour plus de détails. P>
Cependant, c'est toujours Notez que (à partir de lstat code> a été ajouté à la version 1.9726 de Time-Hires version 1.9726 en août 2013. P>
1.9725 code> inclus dans la dernière version stable de
Perl code> à 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. P>
perl code> 5.19.8), que ce que
heure :: embauche code> 's
lstat code> est utilisé em> ou non,
-M de Perl code> /
-A code> /
-c code> 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 code> pour trier les fichiers par Heure de modification. P>
À partir de Perl Code> 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 code> bibliothèque
STAT code> fonction. Cela provoque des différences dans les horodaques signalées par
Perl code> et
Recherche -Printf% TS code>, par exemple.
Cela pourrait être lié à Perl code> représentant l'horodatage comme un seul numéro de point flottant par rapport à la bibliothèque
C code> en tant que deux entiers.
Avez-vous besoin d'une solution portable ou existe-t-il juste un système d'exploitation ciblé?