이 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;
}
name
char *
포인터에 대한 포인터 입니다 (따라서 "문자열"에 대한 포인터). 용도는 이렇습니다
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()
것을 알 수 있습니다 (위의 예에서 ).idx
idinfos
name
name
struct blkid_idinfo
"dos"
libblkid/samples/partitions.c
내부에유틸리티Linux소스 코드는 이를 사용하여 지원되는 파티션 유형을 반복하는 방법의 예를 보여줍니다.
노트:소스 코드libblkid매우 명확하게 배치되어 있는 것 같습니다. 그것이 무엇을 하는지 살펴보세요. 이해하기 쉽습니다( grep
그리고 여러분의 친구입니다;) 또한 다른 예제 소스 코드를 살펴보고 어떻게 작동하는지 살펴보세요.libblkid사용되어야한다.