Как я могу получить mtime высокого разрешения для символьной ссылки в Perl?

Я хочу воспроизвести вывод ls --full-time из сценария Perl для предотвращения издержек вызова ls несколько тысяч раз. Я надеялся использовать статистику, функционируют и захватывают всю информацию оттуда. Однако метка времени в ls произвела, использует часы с высоким разрешением, таким образом, это включает число наносекунд также (согласно документам GNU, это вызвано тем, что - полный рабочий день эквивалентен --format=long --time-style=full-iso, и стиль времени полной ISO включает наносекунды).

Я столкнулся со Временем:: модуль HiRes, который переопределяет стандартную функцию статистики с той, которая возвращает atime/mtime/ctime как числа с плавающей точкой, но нет никакого переопределения для lstat. Это - проблема, потому что вызов статистики на символьной ссылке возвращает информацию для связанного файла, не для самой ссылки.

Таким образом, мой вопрос - это - где может я находить версию lstat, который возвращает atime/mtime/ctime таким же образом как Время:: HiRes:: статистика? Сбой этого, там другой способ получить modtime для символьной ссылки в высоком разрешении (кроме вызова ls).

9
задан Ether 18 March 2010 в 17:13
поделиться

2 ответа

Лучше всего попросить добавить lstat в Time :: HiRes . На самом деле, вы, вероятно, могли бы сделать это сами. Готов поспорить, что все, что вам нужно сделать, это скопировать функцию, которая запускает

void
stat(...)

в HiRes.xs , изменить stat (...) на lstat (. ..) & OP_STAT в OP_LSTAT , добавьте lstat в @EXPORT_OK в HiRes.pm , и перекомпилируйте. Затем отправьте патч, чтобы другие могли получить от него пользу.

3
ответ дан 4 December 2019 в 20:23
поделиться

Если вы хотите использовать Inline :: C, это будет работать с последней версией 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]);
4
ответ дан 4 December 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: