# blkid /dev/sdX
给出分区的文件系统类型,无论是已安装还是未安装。如何在不调用系统调用和解析输出的情况下从C / C ++中执行此操作?我怎么能以编程方式做到这一点?是否有blkid-dev
个包裹?
答案 0 :(得分:4)
你总是可以使用blkid
库(对于ubuntu来说,就像安装libblkid-dev一样简单)。对于实际用法,请参阅:https://github.com/fritzone/sinfonifry/blob/master/plugins/disk_status/client/disk_status.cpp(对于我自己的存储库中的广告代码感到抱歉,但它确实具有此功能)。不要忘记,您需要使用sudo运行应用程序才能完全访问磁盘。
答案 1 :(得分:0)
对于已安装的分区,您的C ++程序可以按顺序读取并解析/proc/self/mounts
伪文件,请参阅proc(5)
对于未安装的分区,它们可以包含任何内容(包括根本没有文件系统,交换数据或原始数据 - 例如某些数据库系统)。所以这个问题甚至可能毫无意义。您可以popen
file -s
命令。
您应该研究/bin/mount
的源代码,因为它是免费软件(它对auto
案例做了类似的事情)。您可能希望使用libmagic(3)(由file(1)命令使用)
答案 2 :(得分:0)
对于已安装分区,您可以执行以下操作(假设您知道分区的安装路径),而不是读取/ 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已过时,因为我不知道另一个会返回文件系统类型的调用。