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吗?

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 偷了家里好多钱去买手机了怎么办 中行信用卡短信邀请办白金卡怎么办 注册邮箱说邮箱地址已被注册怎么办 便利店开在小区里面没生意怎么办 微信支付密码忘了怎么办没银行卡 中行5月扣很多钱是怎么办 中银淘宝校园卡影响征信问题怎么办 中银E盾快到期了怎么办 京东e卡电子卡卡密泄漏怎么办 买错了京东e卡怎么办 京东购买手机激活后有问题怎么办 优购m9锁屏密码忘记了怎么办视频 中百仓储的购物卡过期了怎么办 武汉中百超市购物卡过期怎么办 已认证抵扣的发票发生退货怎么办 京东白条分期买手机额度不够怎么办 京东白条闪付手机不支持开通怎么办 拼多多不小心下两次单付款了怎么办 不小心给了京东快递差评怎么办 京东金融不小心卸载了怎么办 如果京东快递不小心完成订单怎么办 订机票时没有用常旅客卡怎么办 京东退货退款卖家已签收了怎么办 京东账号手机号换了密码忘了怎么办 qq飞车手游录像下载失败怎么办 手机知道qq号怎么破解密码怎么办 网上购物已付钱迟迟不发货怎么办 有人冒充微信头像和熟人借钱怎么办 微信红包输了50多万怎么办 脖子里的绳结接口磨脖子怎么办 母比格犬生了小狗毛色变了怎么办 母比格犬生了小狗毛色很差怎么办 貂皮大衣上的暗扣掉了怎么办 呢子夹克袖子长但又不想改短怎么办 黑色的衣服熨的有点发亮怎么办 宿管阿姨工作中与学生起冲突怎么办 中通快递发的衣服不合适怎么办 加盟母婴店如果不干了货怎么办 双十一搞活动买的东西退货怎么办 天猫预售30天不发货怎么办 天猫搞活动的商品总不发货怎么办