web-dev-qa-db-ja.com

C(Linux)のUSBフラッシュドライブで利用可能な空き容量を確認する

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

マウントされたUSBフラッシュドライブの場合、これは statvfs(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
_

また、statvfs()は_const char *path_をパラメーターの1つとして受け取り、ファイルシステム内の任意のファイルのパス名にすることができます。 _/dev/sda7_は、デバイスの_/dev_パーティションではなく、_sda7_ファイルシステム(実際には仮想ファイルシステムの1つであるため)の使用法を返します。

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

5