lseek 在CentOS 4.4 和 CentOS 6.3 下的区别
来源:互联网 发布:black magic黑卡 知乎 编辑:程序博客网 时间:2024/06/05 16:45
可以通过下面的方式获得文件或文件夹的大小,其中fd 是文件(夹)的file descriptor
long fileSize = lseek(fd, 0, SEEK_END)
但是存在下面的问题
CT6.3
如果传给lseek的fd是一个regular file,没有问题;
如果传给lseek的fd是一个目录,而不是文件,那么会返回一个固定值 9223372036854775807 (0x 7FFF FFFF FFFF FFFF),因为Linux下的目录也是一个文件;
如果传给lseek的fd是一个非空目录,下面有文件并且不为空文件,那么返回的仍然是那些固定值,而不是该目录下所有文件的大小之和
CT4.4
如果传给lseek的fd是一个regular file,没有问题;
如果传给lseek的fd是一个目录(不论是否为空),而不是文件,那么会返回一个固定值 4096,因为Linux下的目录也是一个文件
不管是CT4.4的 4096返回值,还是CT6.3的 9223372036854775807 返回值,都是不对的。事实上,对一个目录做 lseek(fd, 0, SEEK_END) 就已经不对了。
如果真的对一个目录做了 lseek(fd, 0, SEEK_END) 操作,并且将返回值认作是“文件”大小的话,对CT4.4 来说,也就4K大小,但对CT6.3 来说,就悲剧了:9223372036854775807,这么大的数字,如果以它作为文件大小加载文件,并事先分配那么大的内存空间,内存就撑爆了,因为 9223372036854775807 就是 0x 7FFF FFFF FFFF FFFF = 2 ^ 63 - 1,相当于 2 ^ 33 G!
这里的CT6.3 下的 “对目录做lseek(fd, 0, SEEK_END) 操作返回天文数字” 的情况,可以说是lseek() 函数的一个bug吗?
- lseek 在CentOS 4.4 和 CentOS 6.3 下的区别
- Centos 7 和 Centos 6 的区别
- centos和redhat的区别
- Centos 和 Linux的区别
- mysql在centos下的安装和配置
- [MySQL] 在Centos下的启动和关闭
- MongoDB在CentOS下的装配、启动和配置
- memcached在CentOS下的安装和启动
- runlevel在Red Hat(以及其变种, 如CentOS和Fedora)和Ubuntu下的区别
- 在centos 下安装和使用MySQL
- 在centos 下安装和使用MySQL
- minicom在centos和windows下使用
- CentOS 6.x和CentOS 7.x的区别
- Centos和Redhat的区别和联系
- Centos和Redhat的区别和联系
- CentOS 6.3在qume虚拟机下的安装
- CentOS和Ubuntu区别
- hadoop在CentOS下的单机配置
- MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序
- iOS开发的2D绘制--CoreGraphics的简单使用二(画图形)
- 关闭浏览器 注销 刷新也注销
- Hibernate 二级缓存 和 查询缓存
- 外漏发光字的优点
- lseek 在CentOS 4.4 和 CentOS 6.3 下的区别
- MySQL:日期函数、时间函数总结(MySQL 5.X)
- 环境配置"错误:找不到或无法加载主类HelloWorld"之疑
- php按照奖品百分比随机抽奖代码分析
- ArcGIS Server 9.3完整清晰安装流程【转】
- 头文件中应该放些什么
- java 字节流与字符流的区别
- .NET读取Excel为datatable
- Hadoop相关帮助文档地址,留着以后查阅