2011-01-11 6 views
3

ファイルシステム上の空きスペースを見つけるためにstatvfsを使用しようとしています。statvfs issue - printf/debugger

ここでは、コードです:デバッガで

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 

これは私の合計= 437006を与える必要がありますが、私の出力は主張がその合計は2830です。明らかに私の書式や数学で無知なことをしています。

私は行を追加した場合:デバッガが私に適切な値を(上記参照)を示しながら

unsigned long x = (vfs.f_bsize * vfs.f_blocks); 

xは2967912448に評価されます。

システム:Linuxバージョン2.6.18-194.17.1.el5PAE
i386の

私は、この関数を参照すること、ここで他のエントリを読んで、彼らはそれが非常に簡単に見えるよう。だから私はどこに迷いましたか?

答えて

3

fsblkcnt_tのサイズは? 32ビットの場合はオーバーフローの問題です。計算中に一時的に64ビットサイズを使用するだけで済みます。

+0

それでした。私はsprintfのすべてのヴァースをunsigned long long intにキャストしなければならなかった。 – ethrbunny