我正在尝试使用statvfs来查找文件系统上的可用空间。
代码如下:
const char* Connection::getDiskInfo()
{
struct statvfs vfs;
int nRet = statvfs( "/u0", &vfs );
if( nRet ) return NULL;
char* pOut = (char*)malloc( 256 );
memset( pOut, 0, 256 );
sprintf( pOut, "<disk letter='%s' total='%lu' free='%lu' totalfree='%lu'/>",
"/", ( vfs.f_bsize * vfs.f_blocks ) / ( 1024 * 1024 ),
( vfs.f_bsize * vfs.f_bavail ) / ( 1024 * 1024 ),
( vfs.f_bsize * vfs.f_bfree ) / ( 1024 * 1024 ));
return pOut;
}在调试器(NetBeans 6.9)中,我看到了statvfs结构的相应值:
f_bavail = 105811542
f_bfree = 111586082
f_blocks = 111873644
f_bsize = 4096这应该会给我total=437006,但是我的输出坚持total=2830。很明显,我在格式化或数学方面做了一些愚蠢的事情。
如果我添加这一行:
unsigned long x = ( vfs.f_bsize * vfs.f_blocks );当调试器向我显示适当的值时,X的计算结果为2967912448 (参见上文)。
系统: Linux版本2.6.18-194.17.1.el5PAE
i386
我已经阅读了这里提到这个函数的其他条目,它们使它看起来非常简单。那么,我在哪里误入歧途?
发布于 2011-01-12 00:45:03
fsblkcnt_t的大小是多少?如果它是32位的,那么它就是一个溢出问题,你只需要在计算过程中暂时使用64位的大小。
https://stackoverflow.com/questions/4659939
复制相似问题