blkid: blkid_probe_lookup_value() - 이상한 파티션 유형

blkid: blkid_probe_lookup_value() - 이상한 파티션 유형

내 C++ 응용 프로그램에서 썸 드라이브의 파일 시스템 유형을 확인해야 합니다. 새 파티션을 설치하기 전에 이 작업을 수행해야 합니다. 나도 system()함수를 호출하고 싶지 않습니다 . 다음 테스트 코드를 사용해 보았습니다.

#include <blkid/blkid.h>
#include <stdio.h>
int main()
{
    blkid_probe pr;
    const char *ptname;
    const char* devname = "/dev/sdb1";
    pr = blkid_new_probe_from_filename(devname);
    if (!pr)
        printf("faild to open device\n");
    else
    {
        blkid_probe_enable_partitions(pr, true);
        blkid_do_fullprobe(pr);

        blkid_probe_lookup_value(pr, "PTTYPE", &ptname, NULL);
        printf("%s partition type detected\n", ptname);

        blkid_free_probe(pr);   
    }
}

이 코드를 사용하여 썸 드라이브를 삽입하면 ntfs내 파티션이 dos로 표시됩니다. 썸 드라이브를 삽입하거나 fat코드 ext4에서 이상한 문자열을 반환하지만 두 파일 시스템 모두에서 동일합니다 AWAVI��AUATL�%�.

이러한 이상한 출력의 원인은 무엇입니까? 파일 시스템을 확인하는 더 좋은 방법이 있을까요? 도움을 주셔서 미리 감사드립니다.

답변1

어떤 파일 시스템인지 알고 싶다면 먼저 해당 파일 시스템이 a인지 확인한 다음 다음을 사용하여 파일 시스템 유형을 알아내야 합니다 sdb1.USAGEfilesystemTYPE

파일 시스템 조회를 활성화하려면 다음 플래그를 설정해야 합니다.

blkid_probe_set_superblocks_flags(probe, BLKID_SUBLKS_USAGE | BLKID_SUBLKS_TYPE |
                                         BLKID_SUBLKS_MAGIC | BLKID_SUBLKS_BADCSUM);

결과와 관련하여 초기화하지 않은 반환 값을 확인(또는 먼저 사용해야 함) 하므로 blkid_probe_lookup_value조회 가 실패하면 쓰레기가 발생합니다. 그리고 파티션 에 .blkid_probe_has_valueptnameNULLPTTYPEPTTYPE

사용법과 유형이 포함된 버전은 다음과 같습니다.

#include <blkid/blkid.h>
#include <stdio.h>
#include <string.h>

int main()
{
    blkid_probe pr;
    const char *value = NULL;
    const char* devname = "/dev/sdb1";
    int ret = 0;
    pr = blkid_new_probe_from_filename(devname);
    if (!pr)
        printf("faild to open device\n");
    else
    {
        blkid_probe_enable_partitions(pr, 1);
        blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_USAGE | BLKID_SUBLKS_TYPE |
                                              BLKID_SUBLKS_MAGIC | BLKID_SUBLKS_BADCSUM);
        blkid_do_fullprobe(pr);

        ret = blkid_probe_lookup_value(pr, "USAGE", &value, NULL);
        if (ret != 0) {
                printf("lookup failed\n");
                return 1;
        } else
                printf("usage: %s\n", value);

        if (strcmp(value, "filesystem") != 0) {
                printf("not filesystem\n");
                return 1;
        }

        ret = blkid_probe_lookup_value(pr, "TYPE", &value, NULL);
        if (ret != 0) {
                printf("lookup failed\n");
                return 1;
        } else
                printf("type: %s\n", value);

        blkid_free_probe(pr);
    }
}

관련 정보