C(Linux)を使用してUSBフラッシュドライブの空き容量を確認する

C(Linux)を使用してUSBフラッシュドライブの空き容量を確認する

LinuxのCプログラムでUSBフラッシュドライブの空き容量を知りたいです。以前はこの問題を解決しようとしましたが、system("df -h /dev/sda1")Linux Cアプリケーションでシステムコマンドを使用すると、いくつかのタイミングの問題が発生しました。したがって、利用可能な空き容量を確認するには、さまざまな種類のシステムコール/ライブラリ機能を使用する方法を知る必要があります。

答え1

マウントされたUSBフラッシュドライブの場合は、次のことができます。統計ファイルシステム(3)関数を使用するには、マウントポイントへのパスを指定する必要があり、デフォルトでは小さなバージョンがありますdf(ただし、マウントされたファイルシステムでのみ実行されます)。

$ cat fs_usage.c 
#include <stdio.h>
#include <sys/statvfs.h>

int main(int argc, char **argv){

    struct statvfs fs_usage;
    statvfs(argv[1],&fs_usage);
    printf("%s:%f bytes available, %f bytes used\n",argv[1],
                fs_usage.f_frsize*(double)fs_usage.f_bavail,
                fs_usage.f_frsize * (double)(fs_usage.f_blocks - fs_usage.f_bfree));
    return 0;
}
$ gcc fs_usage.c -o fs_usage
$ df -B 1 /mnt/ubuntu
Filesystem        1B-blocks         Used  Available Use% Mounted on
/dev/sdb1      118013599744 105134329856 6860865536  94% /mnt/ubuntu
$ ./fs_usage /mnt/ubuntu/
/mnt/ubuntu/:6860865536.000000 bytes available, 105134329856.000000 bytes used

また、引数の1つとして、ファイルシステム内のすべてのファイルへのパス名にすることもできます。たとえば、statvfs()ファイルシステムのパーティションではなくファイルシステムの使用量が返されます(実際には仮想ファイルシステムの1つであるため)。デバイス。const char *path/dev/sda7/devsda7

f_frsizeここでは同等のものを使用していますが、f_bsize一部のファイルシステムでは、フラグメントサイズがブロックサイズより小さい場合があります。バラよりhttps://unix.stackexchange.com/a/463370/85039詳細


Cライブラリ(通常はglibcですが、組み込みプラットフォームでは他のものかもしれません)がstatvfs(3)を遅すぎる方法で実装している場合は、おそらくデフォルトライブラリを使用する必要があります。statfs(2) または fstatfs(2)代わりに直接システムコールをしてください。

関連情報