lseek 在CentOS 4.4 和 CentOS 6.3 下的区别

可以通过下面的方式获得文件或文件夹的大小,其中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 下的区别)