libblkid 라이브러리: "blkid_superblocks_get_name" 함수의 목적은 무엇입니까?

libblkid 라이브러리: "blkid_superblocks_get_name" 함수의 목적은 무엇입니까?

libblkid라이브러리를 사용하여 C/C++ 프로그램의 블록 장치에 있는 다양한 파일 시스템을 분석하려고 하는데 잘 작동합니다. 하지만 나는 혼란스러워blkid_superblocks_get_name기능은 다음에서 비롯됩니다.이 도서관.

함수는 some 을 할당하는데 name, 이름이 무엇입니까? 또한 첫 번째 (입력) 매개변수는 무엇을 의미하나요 idx? 이러한 함수는 첫 번째 인수 유형을 갖는 데 사용됩니다 blkid_probe.

답변1

기능을 간단히 살펴보겠습니다.

int blkid_superblocks_get_name(size_t idx, const char **name, int *usage)
{
    if (idx < ARRAY_SIZE(idinfos)) {
        if (name)
            *name = idinfos[idx]->name;
        if (usage)
            *usage = idinfos[idx]->usage;
        return 0;
    }
    return -1;
}

namechar *포인터에 대한 포인터 입니다 (따라서 "문자열"에 대한 포인터). 용도는 이렇습니다

char *the_name = NULL;
int usage = 0;
size_t idx;

idx = somehow_get_a_valid_index();

blkid_superblock_get_name(idx, &the_name, &usage);

the_name이 함수는 무언가의 이름에 대한 포인터를 설정합니다 . 좀 더 자세히 조사해 봅시다. idinfos그것이 무엇이고 어디서 오는 걸까요?

결과는 idinfos다음의 배열입니다 struct blkid_idinfo *.

static const struct blkid_idinfo *idinfos[] =
{
    &aix_pt_idinfo,
    &sgi_pt_idinfo         
    &sun_pt_idinfo,     
    &dos_pt_idinfo,
    &gpt_pt_idinfo,
    &pmbr_pt_idinfo,        /* always after GPT */
    &mac_pt_idinfo,
    &ultrix_pt_idinfo,
    &bsd_pt_idinfo,
    &unixware_pt_idinfo,
    &solaris_x86_pt_idinfo,
    &minix_pt_idinfo
};

더 자세히 살펴보면 우리는 struct blkid_idinfo발견합니다.

struct blkid_idinfo
{
    const char      *name;          /* fs, raid or partition table name */
    int             usage;          /* BLKID_USAGE_* flag */
    int             flags;          /* BLKID_IDINFO_* flags */
    int             minsz;          /* minimal device size */

    int             (*probefunc)(blkid_probe pr, const struct blkid_idmag *mag);
    struct blkid_idmag      magics[];
};

Doxygen은 이것이 파일 시스템 또는 RAID를 설명한다고 언급했습니다. 멤버 중 한 명을 살펴보겠습니다 idinfos.

const struct blkid_idinfo dos_pt_idinfo =
{
    .name           = "dos",
    .probefunc      = probe_dos_pt,
    .magics         =
    {
        /* DOS master boot sector:
         *
         *     0 | Code Area
         *   440 | Optional Disk signature
         *   446 | Partition table
         *   510 | 0x55
         *   511 | 0xAA
         */
        { .magic = "\x55\xAA", .len = 2, .sboff = 510 },
        { NULL }
    }
};

이는 분명히 DOS 파티션 구성표(MBR 파티션 테이블이라고도 함)를 설명합니다.

따라서 idinfos인식되는 여러 파티션 형식이 설명됩니다 (MBR, GPT, BSD 디스크 레이블...). 되돌아보면, 배열에 오프셋을 취하고(위에서 인용한 대로) 해당 - 요소를 가리킨다 는 blkid_superblocks_getname()것을 알 수 있습니다 (위의 예에서 ).idxidinfosnamenamestruct blkid_idinfo"dos"

libblkid/samples/partitions.c내부에유틸리티Linux소스 코드는 이를 사용하여 지원되는 파티션 유형을 반복하는 방법의 예를 보여줍니다.

노트:소스 코드libblkid매우 명확하게 배치되어 있는 것 같습니다. 그것이 무엇을 하는지 살펴보세요. 이해하기 쉽습니다( grep그리고 여러분의 친구입니다;) 또한 다른 예제 소스 코드를 살펴보고 어떻게 작동하는지 살펴보세요.libblkid사용되어야한다.

관련 정보