編集 #2 では、df 出力と一致するように、Usage% の計算をこれに更新する必要があります:
100.0 * (double) (vfs.f_blocks - vfs.f_bfree) / (double) (vfs.f_blocks - vfs.f_bfree + vfs.f_bavail)
理由:
使用 =f_blocks - f_bfree
アベイル =f_bavail
df % =使用済み / (使用済み + 使用可能)
df
のデータは f_bavail
に基づいている可能性があります 、 f_bfree
ではありません . df のソース コードを調べて、どのように動作するかを確認すると役立つ場合があります。処理が必要ないくつかの特殊なケースがあります (たとえば、使用されているスペースが非 root ユーザーが使用できるスペースの量を超えている場合) が、通常のケースに関連するコードは次のとおりです:
uintmax_t u100 = used * 100;
uintmax_t nonroot_total = used + available;
pct = u100 / nonroot_total + (u100 % nonroot_total != 0);
つまり、100 * used / (used + available)
、 切り上げ。 df 出力からの値を差し込むと、 100 * 14159676 / (14159676 + 25837672) = 35.4015371
が得られます 、切り上げは 36% で、df
と同じです。