忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2103 | 回复: 4

perl如何读文件的,不是问的code,而是处理过程 [复制链接]

论坛徽章:
0
发表于 2017-09-29 13:40 |显示全部楼层
请教一下, perl 是如何读取文件的。注意不是code 怎么写,而是处理过程。
我测试了一下,一个文件26万行,在刚进入文件句柄迭代之后,把文件删除。结果是所有的文件内容都读取到了。

之前认为的是,文件句柄会一部分一部分读入到内存,然后做迭代操作。(或许数据量不够大?)

所以想问下各位大神,Perl在操作文件句柄时,是怎样的过程。

论坛徽章:
34
CU大牛徽章
日期:2013-04-17 11:10:17CU大牛徽章
日期:2013-09-18 15:26:10狮子座
日期:2013-09-27 17:44:07CU十二周年纪念徽章
日期:2013-10-24 15:41:34射手座
日期:2013-10-24 21:01:23辰龙
日期:2013-12-20 17:07:19狮子座
日期:2014-05-12 11:00:00寅虎
日期:2014-06-04 16:25:27IT运维版块每日发帖之星
日期:2015-08-17 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30
发表于 2017-09-29 14:59 |显示全部楼层
用while<>的话,是部分读取的。占用内存小。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2017-09-30 12:13 |显示全部楼层
文件是文件系统在维护,大多数 OS 用的文件系统都是内核级的,这就意味着所有的文件操作一定会走系统调用,只要走系统调用,你就可以用 strace(一个工具软件) 来追踪程序的运行细节。

不管是你用来读文件的 perl 命令,还是用来删除文件的 rm 命令,你都可以用 strace 来跟踪它们到底是如何工作的,
strace 会告诉你详细的细节。

以上是【渔】的部分。建议你认真阅读 APUE,这样你才能够读懂 strace 的输出。

【鱼】的部分就简单了:你删除文件的时候,实际上文件并没有真正删除,只要有打开的文件句柄尚未关闭,仍然是可以继续读到文件内容的,这是王八的屁股,规定。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2017-10-02 12:28 |显示全部楼层
动态语言在底层做了很多为改善效率的优化,如果想了解底层的运作,还是看源码吧。

或者是研究更底层的 Golang , 看看读取文件的过程。

其实这些知识没什么用,正在读取的文件删除,本身是意外事件。想编写更快的代码,还是用 Golang 等静态语言

论坛徽章:
0
发表于 2017-10-05 11:04 |显示全部楼层
在Linux上,如果在文件句柄打开的情况下把文件删除的话,只要该句柄依然有效则文件的inode会依然存在,直至句柄结束文件的内容才真正被删除。即这种情况下文件系统里看不到这个文件,而从该句柄依然可以作读取操作。利用这个trick可以实现所谓anonymous temporary file,虽然一般情况下不需要这么做。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP