linux – 使用perl读取系统文件,而不在打开时发出额外的搜索系统调用

linux – 使用perl读取系统文件,而不在打开时发出额外的搜索系统调用,第1张

概述我正在尝试使用perl来解析/ proc和/ sys linux伪文件系统( procfs和 sysfs)中的一些伪文件.这些文件与常规文件不同 – 它们由自定义文件 *** 作处理程序实现.对于stat,大多数都没有大小,有些不能打开读取,其他不能写入.有时它们被错误地实现(这是错误的,但它已经在内核中)并且我仍然希望直接从perl读取它们而无需启动一些帮助工具. 有一个使用perl读取/ proc / 我正在尝试使用perl来解析/ proc和/ sys linux伪文件系统( procfs和 sysfs)中的一些伪文件.这些文件与常规文件不同 – 它们由自定义文件 *** 作处理程序实现.对于stat,大多数都没有大小,有些不能打开读取,其他不能写入.有时它们被错误地实现(这是错误的,但它已经在内核中)并且我仍然希望直接从perl读取它们而无需启动一些帮助工具.

有一个使用perl读取/ proc / loadavg的快速示例,此文件已正确实现:

perl -e 'open F,"</proc/loadavg"; $_=<F>; print '

使用命令的strace,我可以检查perl如何实现open函数:

$strace perl -e 'open F,"</proc/loadavg"; $_=<F>; print ' 2>&1 | egrep -A5 ^open.*loadavgopen("/proc/loadavg",O_RDONLY)         = 3ioctl(...something strange...)    = -1 ENottYlseek(3,SEEK_CUR)                   = 0fstat(3,{st_mode=S_IFREG|0444,st_size=0,...}) = 0fcntl(3,F_SETFD,FD_CLOEXEC)           = 0

open perl函数使用lseek系统调用.

使用cat / proc / loadavg的strace,没有额外的搜索类型系统调用:

$strace cat /proc/loadavg 2>&1 | egrep -A2 ^open.*loadavgopen("/proc/loadavg",O_RDONLY)         = 3fstat(3,...}) = 0fadvise64(3,POSIX_FADV_SEQUENTIAL) = 0

我想要读取(或写入)错误实现的特殊文件寻求文件 *** 作,并且在搜索之后不会提供任何有用的数据来读取(或写入)系统调用.

有没有办法打开文件,在没有调用额外的lseek的情况下读取perl5(没有外部模块)? (并且不使用系统(“cat< / proc / loadavg”)) 有没有办法打开文件写入perl5而不调用额外的lseek? 有sysopen,但它也有额外的lseek:perl -e’使用Fcntl; sysopen(F,“/ proc / loadavg”,O_RDONLY); sysread(F,$_,2048);打印’

解决方法 正如你所注意到的那样,Perl内置的开放式面具非常具有魔力.如果那个魔法挡住你的方式,那么sysopen和POSIX :: open()会提供越来越低的魔力. POSIX :: open()非常神奇,它返回文件描述符而不是Perl文件句柄,你必须使用POSIX :: read()而不是普通的Perl运算符来从中获取数据.如果这对你的情况不够原谅,你可能会失去运气.

自从Perl 5的第一个版本发布以来,POSIX模块就是核心perl发行版的一部分,所以如果你没有它,你的Perl安装就会瘫痪.

总结

以上是内存溢出为你收集整理的linux – 使用perl读取系统文件,而不在打开时发出额外的搜索系统调用全部内容,希望文章能够帮你解决linux – 使用perl读取系统文件,而不在打开时发出额外的搜索系统调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/1049874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存