この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使用すべき