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

또한 인수 중 하나로 파일 시스템 내의 모든 파일에 대한 경로 이름이 될 수 있습니다. 예를 들어 statvfs()파일 시스템 의 파티션이 아닌 파일 시스템의 사용량이 반환됩니다 (실제로 가상 파일 시스템 중 하나이기 때문에). 장치.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)대신 직접 시스템 호출을 하세요.

관련 정보