Portál AbcLinuxu, 3. listopadu 2025 18:44
statfs(2) a následně napsal takovýhle kód:
struct statfs stats;
cout << statfs(path.c_str(), &stats) << endl; /* path = "/" */
cout << stats.f_bfree << " [" << stats.f_bsize << "]" << endl;
cout << stats.f_bfree * stats.f_bsize << endl;
Statfs proběhlo v pořádku (vrací nulu), ale výsledný volný místo se dost liší od čísla co ukazuje df, asi vo 1.5 Giga. To se mi vůbec nelíbí. Podezírám stafs(), že mi vrací nějaký bullshity. Zkoušel jsem i statvfs(), ale výsledek byl stejný.df, no ale kdo se má v tom jejich #define pekle vyznat. Používaj tam taky statvfs(), ale dělaj okolo toho nějaký úpravy, který se mi nepodařilo dešifrovat...
root|vojta-dell /tmp #> /cesta/k/programu
0
1542023 [4096]
6316126208
root|vojta-dell /tmp #> df -h
Souborový systém Velikost Užito Volno Uži% Připojeno do
/dev/sda1 30G 24G 4,4G 85% /
(...)
Díky za každou radu.
Řešení dotazu:
df jsou asi 3/4 tý, co dostanu ze statfs()...
statfs() ukazuje 6'166'932 volných 1K bloků, zatímco df jen 4'594'128 1K bloků.
). A kolik je 5% z 30 G?

long f_bfree; /* free blocks in fs */ long f_bavail; /* free blocks avail to non-superuser */neni jejich rozdil je podle me tech 5% o kterych se tu mluvi
mount a losetup, ale to mi nepřijde jako právě čistý řešení, radši bych se tomu vyhnul...
mount() nebo ioctl() na chvíli příslušnou capabilitie(s) povolim, ne?
blocks_used = s.f_blocks - s.f_bfree;
blocks_percent_used = 0;
if (blocks_used + s.f_bavail) {
blocks_percent_used = (blocks_used * 100ULL + (blocks_used + s.f_bavail)/2) / (blocks_used + s.f_bavail);
}
A zbytek informaci:
static unsigned long kscale(unsigned long b, unsigned long bs)
{
return (b * (unsigned long long) bs + 1024/2) / 1024;
}
printf(" %9lu %9lu %9lu %3u%% %s\n",
kscale(s.f_blocks, s.f_bsize), Celkova kapacita (kB)
kscale(s.f_blocks - s.f_bfree, s.f_bsize), Vyuzito (kB)
kscale(s.f_bavail, s.f_bsize), Dostupne misto (kB)
blocks_percent_used, mount_point); Procent zaplneni a pripojny bod
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.