En su edición n.º 2, el cálculo del % de uso debe actualizarse para que coincida con la salida de df:
100.0 * (double) (vfs.f_blocks - vfs.f_bfree) / (double) (vfs.f_blocks - vfs.f_bfree + vfs.f_bavail)
Razonamiento:
Usado =f_blocks - f_bfree
Disponibilidad =f_bavail
df % =Usado / (Usado + Disponible)
df
Los datos de pueden estar basados en f_bavail
, no f_bfree
. Puede que le resulte útil mirar el código fuente de df para ver cómo funciona. Tiene una serie de casos extremos con los que debe lidiar (por ejemplo, cuando el espacio utilizado excede la cantidad de espacio disponible para usuarios que no son root), pero el código relevante para el caso normal está aquí:
uintmax_t u100 = used * 100;
uintmax_t nonroot_total = used + available;
pct = u100 / nonroot_total + (u100 % nonroot_total != 0);
En otras palabras, 100 * used / (used + available)
, redondeado. Conectar los valores de su salida df da 100 * 14159676 / (14159676 + 25837672) = 35.4015371
, que redondeado es 36 %, al igual que df
calculado.