проблема statvfs - printf / отладчик - PullRequest
3 голосов
/ 11 января 2011

Я пытаюсь использовать 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

это должно дать мне итого = 437006, но мой вывод настаивает на том, что итого = 2830. Очевидно, я делаю что-то невежественное в моем форматировании или математике.

Если я добавлю строку:

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

x оценивается как 2967912448, тогда как отладчик показывает мне соответствующие значения (см. Выше).

система: версия Linux 2.6.18-194.17.1.el5PAE
i386

Я читал здесь другие записи, относящиеся к этой функции, и они делают ее довольно простой. Так куда же я сбился с пути?

1 Ответ

3 голосов
/ 11 января 2011

Каков размер fsblkcnt_t? Если он 32-битный, то это проблема переполнения, и вам просто нужно временно использовать 64-битный размер во время вычисления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...