res mtime在Perl中的符号链接?

我想从Perl脚本中重现ls --full-time的输出,以避免数千次调用ls的开销。 我希望使用stat函数并从那里获取所有信息。 但是,ls输出中的时间戳使用高分辨率时钟,因此它也包含纳秒数(根据GNU文档,这是因为 - 完全时间相当于--format=long --time-style=full-iso ,full-iso时间样式包含纳秒)。

我遇到了Time :: HiRes模块,该模块覆盖了标准stat函数,并将一个返回时间/ mtime / ctime作为浮点数的函数,但是不会覆盖lstat。 这是一个问题,因为在符号链接上调用stat会为链接文件返回信息,而不是链接本身。

所以我的问题是 - 我在哪里可以找到一个版本的lstat,它以与Time :: HiRes :: stat相同的方式返回atime / mtime / ctime? 如果不这样做,是否有另一种获得高分辨率符号链接的modtime的方法(除了调用ls)。


如果你愿意使用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]);

你最好的选择是要求将lstat添加到Time :: HiRes。 事实上,你可以自己做。 我敢打赌,你需要做的就是复制启动的功能

void
stat(...)

HiRes.xs ,改变stat(...)lstat(...)OP_STATOP_LSTAT ,加lstat@EXPORT_OKHiRes.pm ,并重新编译。 然后提交补丁,以便其他人可以受益。


以下更改工作。 这基本上包含对HiRes.pm模块以及xs文件的更改。

在HiRes.pm

sub lstat { 
     my @lstatvalues = CORE::lstat(shift);   
     my @nanosecvalues =  Time::HiRes::lstatimplementation( $lstatvalues[8], $lstatvalues[9], $lstatvalues[10]);   
     ( $lstatvalues[8], $lstatvalues[9], $lstatvalues[10] ) = ( $nanosecvalues[0], $nanosecvalues[1], $nanosecvalues[2]);   
     return @lstatvalues;
}

还将lstat添加到@EXPORT_OK列表中。

在HiRes.xs中

void 
lstatimplementation(...)
PPCODE:
  UV atime = SvUV( ST( 0 ) );
  UV mtime = SvUV( ST( 1 ) );
  UV ctime = SvUV( ST( 2 ) );
  UV atime_nsec;
  UV mtime_nsec;
  UV ctime_nsec;
  hrstatns(atime, mtime, ctime,
       &atime_nsec, &mtime_nsec, &ctime_nsec);
  if (atime_nsec)
    XPUSHs( sv_2mortal(newSVnv(atime + 1e-9 * (NV) atime_nsec)));
  if (mtime_nsec)
    XPUSHs( sv_2mortal(newSVnv(mtime + 1e-9 * (NV) mtime_nsec)));
  if (ctime_nsec)
    XPUSHs( sv_2mortal(newSVnv(ctime + 1e-9 * (NV) ctime_nsec)));
链接地址: http://www.djcxy.com/p/59215.html

上一篇: res mtime for a symbolic link in Perl?

下一篇: Why does Perl's tr/\n// get slower and slower as line lengths increase?