libblkidライブラリ: "blkid_superblocks_get_name"関数の目的は何ですか?

libblkidライブラリ:

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

おすすめ記事