Portál AbcLinuxu, 11. května 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ů.
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.