簡體   English   中英

在Linux中的C / C ++中,如何確定已安裝或已卸載分區的文件系統類型

[英]In Linux in C/C++ how to determine filesystem type of a mounted or unmounted partition

# blkid /dev/sdX給出分區的文件系統類型,無論是已安裝還是已卸載。 我如何在不調用系統調用並解析輸出的情況下從C / C ++做到這一點? 我該如何編程? 是否有blkid-dev軟件包?

您總是可以使用blkid庫(對於ubuntu,就像安裝libblkid-dev一樣容易)。 有關實際用法,請參見: https : //github.com/fritzone/sinfonifry/blob/master/plugins/disk_status/client/disk_status.cpp (很抱歉,我自己的存儲庫中的廣告代碼發布了,但是正是在那里開發了此功能)。 並且不要忘記,您將需要使用sudo運行應用程序才能完全訪問磁盤。

對於已掛載的分區,您的C ++程序可以順序讀取並解析/proc/self/mounts偽文件,請參見proc(5)

對於已卸載的分區,它們可以包含任何內容(根本不包括文件系統,交換數據或原始數據,例如對於某些數據庫系統)。 因此,這個問題甚至可能毫無意義。 您可能會popen一些file -s命令。

您應該研究/bin/mount的源代碼,因為它是免費軟件(對於auto案例它也做類似的事情)。 您可能要使用libmagic(3) (由file(1)命令使用)

對於已安裝的分區,您可以執行以下操作(而不是讀取/ proc / self / mounts)(假設您知道分區的安裝路徑):

#include <sys/vfs.h>
#include <stdio.h>
#include <linux/magic.h>

static const struct {
    unsigned long magic;
    const char   *type;
} types[] = {
    {EXT4_SUPER_MAGIC, "ext4"},
    {TMPFS_MAGIC, "tmpfs"},
};


const char *get_type(unsigned long magic) {
    static const char * unkown="unkown";
    unsigned int i;

    for (i=0; i < sizeof(types)/sizeof(types[0]); i++)
        if (types[i].magic == magic)
            return types[i].type;

    return unkown;
}

void main() {

    struct statfs buf;

    statfs("/", &buf);
    printf("/ is %s\n", get_type((unsigned long)buf.f_type));

    statfs("/tmp", &buf);
    printf("/tmp is %s\n", get_type((unsigned long)buf.f_type));    
}

就我而言,它顯示:

/ is ext4
/tmp is tmpfs

有關更多詳細信息,請參見

man statfs

您顯然可以添加所需的所有類型。 它們由statfs手冊頁列出。 據說statfs已過時,因為我不知道會返回文件系統類型的另一個調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM