![](/img/trans.png)
[英]How can I determine filesystem type (name) with Linux API for 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.