Sur votre Edit #2, le calcul du pourcentage d'utilisation doit être mis à jour pour correspondre à la sortie df :
100.0 * (double) (vfs.f_blocks - vfs.f_bfree) / (double) (vfs.f_blocks - vfs.f_bfree + vfs.f_bavail)
Raisonnement:
Utilisé =f_blocks - f_bfree
Dispo =f_bavail
df % =Utilisé / (Utilisé + Dispo)
df
Les données de peuvent être basées sur f_bavail
, pas f_bfree
. Vous trouverez peut-être utile de regarder le code source de df pour voir comment il fait les choses. Il a un certain nombre de cas extrêmes qu'il doit traiter (par exemple, lorsque l'espace utilisé dépasse la quantité d'espace disponible pour les utilisateurs non root), mais le code pertinent pour le cas normal est ici :
uintmax_t u100 = used * 100;
uintmax_t nonroot_total = used + available;
pct = u100 / nonroot_total + (u100 % nonroot_total != 0);
En d'autres termes, 100 * used / (used + available)
, arrondi. Brancher les valeurs de votre sortie df donne 100 * 14159676 / (14159676 + 25837672) = 35.4015371
, qui est arrondi à 36 %, tout comme df
calculé.