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_STAT
到OP_LSTAT
,加lstat
到@EXPORT_OK
在HiRes.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?