我正在尝试使用该libblkid
库从 C/C++ 程序分析块设备上的各种文件系统,并且效果良好。然而我很困惑blkid_superblocks_get_name函数来自这个图书馆。
该函数分配了一些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应该使用。