Nella tua modifica n. 2, il calcolo Usage% deve essere aggiornato a questo per corrispondere all'output df:
100.0 * (double) (vfs.f_blocks - vfs.f_bfree) / (double) (vfs.f_blocks - vfs.f_bfree + vfs.f_bavail)
Ragionamento:
Usato =f_blocks - f_bfree
Avail =f_bavail
df % =Usato / (Usato + Disponibile)
df
i dati di possono essere basati su f_bavail
, non f_bfree
. Potresti trovare utile guardare il codice sorgente di df per vedere come fa le cose. Ha un numero di casi limite che deve affrontare (ad esempio, quando lo spazio utilizzato supera la quantità di spazio disponibile per gli utenti non root), ma il codice pertinente per il caso normale è qui:
uintmax_t u100 = used * 100;
uintmax_t nonroot_total = used + available;
pct = u100 / nonroot_total + (u100 % nonroot_total != 0);
In altre parole, 100 * used / (used + available)
, arrotondato. Inserendo i valori dall'output df si ottiene 100 * 14159676 / (14159676 + 25837672) = 35.4015371
, che arrotondato per eccesso è il 36%, proprio come df
calcolato.