【发布时间】:2012-03-15 22:30:48
【问题描述】:
我想直接从 perl 与 linux 交互,以执行一些调用,例如 statvfs。我很好奇是否有一种方法可以只使用核心 perl 包(没有额外的模块)。
特别是,我想获取未安装/启用 df 的服务器的磁盘使用信息。
【问题讨论】:
我想直接从 perl 与 linux 交互,以执行一些调用,例如 statvfs。我很好奇是否有一种方法可以只使用核心 perl 包(没有额外的模块)。
特别是,我想获取未安装/启用 df 的服务器的磁盘使用信息。
【问题讨论】:
use POSIX; 浮现在脑海中。然而,statvfs 不在它提供的功能之列。也许您正在这里寻找use Filesys::Df;。
我还没有看到安装了 perl,但没有安装 coreutils(df) 的系统...
【讨论】:
df output 非常容易出错。
Filesys::Df,因为它不是核心perl的一部分。
我想直接从 perl 与 linux 交互,以执行一些调用,例如 statvfs。我很好奇是否有办法只使用核心 perl 包(没有额外的模块)来做到这一点。
对您的问题的技术性但可能不是很有用的回答是,是的,确实存在一种方法来执行 statvfs 仅使用核心 perl 而没有模块的方式。它的工作原理是这样的:
my $statfs_buffer = "\0" x length(pack($STATFS_TEMPLATE, ()));
my $retval = syscall($SYS_statfs, $some_filename, $statfs_buffer);
if ($retval == -1) {
die "statfs failed: $!";
}
my($f_type, $f_bsize, $f_blocks, $f_bfree,
$f_bavail, $f_files, $f_ffree,
$f_fsid, $f_namelen) = unpack($STATFS_TEMPLATE, $statfs_buffer);
问题是您必须自己找出$SYS_statfs 和$STATFS_TEMPLATE 的值;前者容易,后者不难。
但是,在某些系统上,您必须使用这些系统的 statfs64 变体。
所以是的,只要你有足够的决心,可能做你想做的事。不过,还有更好的方法。
【讨论】:
statfs 结构看起来与 Linux 不同,系统调用号也不同。