如何在不挂载设备的情况下以编程方式发现文件系统(如"fdisk -l")
How to programmatically discover the filesystem without mounting the device (like "fdisk -l")
我需要在 Linux 中找到一个系统调用,以发现我的应用程序中连接的笔式驱动器的文件系统。我发现"fdisk -l"可以完成这项工作,但是我现在需要发现这是如何发生的。我无法发现读取 fdisk 代码,唯一确定的想法是:
- 不使用结构 statfs 或 statvfs;
- fdisk 不需要挂载设备来查找文件系统;
Obs:我的应用程序是用C++编写的,运行在嵌入式Linux系统中。
命令 fdisk -l 显示由系统 ID 字节表示的文件系统。 此字节位于主引导记录 (MBR) 内的分区表中。 MBR 通常存储在第一个硬盘驱动器上的第一个圆柱体上(尽管任何硬盘驱动器都可以有 MBR)。
我认为您可以简单地使用打开和读取系统调用从磁盘读取 MBR,假设运行您的程序的用户具有权限:
char buf[446];
int fd = open("/dev/hda", O_RDONLY);
read(fd, buf, 446);
查看 MBR 格式,然后读出分区表以获取系统 ID 字节。 下面是系统 ID 字节的类型列表。
我只知道 Linux 上的 fdisk 是如何工作的,上次我检查它不支持 GPT 或任何其他分区格式。 所以这个答案只与经典的MBR格式相关。
你可以使用 util-linux 的 libblkid 来做到这一点。源分发包括一个示例,其中列出了指定设备上的分区,包括文件系统类型。
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 不同/较旧的处理器运行c++代码的方式是否不同
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 重载方法的方式会在使用临时调用时生成编译器错误
- 在reactor中存储eventHandlers的最佳方式是什么
- 如何以优化的方式同时迭代两个间距不相等的数组
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 为什么C++有不同的变量初始化方式?
- 在AVX通道中混洗的最佳方式
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- 如何以静态代码分析友好的方式使用 #define 防护?
- 如何在不挂载设备的情况下以编程方式发现文件系统(如"fdisk -l")