如何使用 Linux API for C 确定文件系统类型(名称)?
How can I determine filesystem type (name) with Linux API for C?
我需要获取一个包含fs名称的C字符串。 有很多命令可以在终端中打印 fs 名称,但我找不到简单的方法来在 C/C++ 代码中获取它。
你解析/proc/mounts
.
如果您使用了 stat() 系列函数之一,并且具有数字形式的文件系统标识符 (st_dev
),您只需在/proc/mounts
中列出的每个挂载点stat()
挂载目录(将/./
附加到每个挂载点,以便您统计挂载目录,而不是其父文件系统中的挂载点), 直到你看到一个匹配的。使用该条目(行)您可以获得内核看到的文件系统的类型。
请记住,Linux 系统中的/proc/
和/sys/
不在磁盘上,而是内核公开某些细节的正确接口。当前挂载的文件系统(/proc/mounts
)就是其中之一。
在posixc中,使用fopen()
、getline()
、fclose()
、free()
和strtok()
或sscanf()
或您自己的分行函数来实现这是非常简单的。请记住,作为内核接口,/proc/
和/sys/
中的文件内容永远不会本地化;它们始终位于默认的 C/POSIX 区域设置中。
Linux C APIstatfs()
(灵感来自BSD,对于其他Unix,如OS,已经研究了coreutils的stat
)。
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/vfs.h>
// https://github.com/linux-test-project/ltp/tree/master/include/tst_fs.h
/* man 2 statfs or kernel-source/include/linux/magic.h */
#define TST_BTRFS_MAGIC 0x9123683E
#define TST_NFS_MAGIC 0x6969
#define TST_RAMFS_MAGIC 0x858458f6
#define TST_TMPFS_MAGIC 0x01021994
#define TST_V9FS_MAGIC 0x01021997
#define TST_XFS_MAGIC 0x58465342
#define TST_EXT2_OLD_MAGIC 0xEF51
/* ext2, ext3, ext4 have the same magic number */
#define TST_EXT234_MAGIC 0xEF53
#define TST_MINIX_MAGIC 0x137F
#define TST_MINIX_MAGIC2 0x138F
#define TST_MINIX2_MAGIC 0x2468
#define TST_MINIX2_MAGIC2 0x2478
#define TST_MINIX3_MAGIC 0x4D5A
#define TST_UDF_MAGIC 0x15013346
#define TST_SYSV2_MAGIC 0x012FF7B6
#define TST_SYSV4_MAGIC 0x012FF7B5
#define TST_UFS_MAGIC 0x00011954
#define TST_UFS2_MAGIC 0x19540119
#define TST_F2FS_MAGIC 0xF2F52010
#define TST_NILFS_MAGIC 0x3434
#define TST_EXOFS_MAGIC 0x5DF5
#define TST_OVERLAYFS_MAGIC 0x794c7630
#define TST_FUSE_MAGIC 0x65735546
// https://github.com/linux-test-project/ltp/tree/master/lib/tst_fs_type.c
const char *tst_fs_type_name(long f_type)
{
switch (f_type) {
case TST_TMPFS_MAGIC:
return "tmpfs";
case TST_NFS_MAGIC:
return "nfs";
case TST_V9FS_MAGIC:
return "9p";
case TST_RAMFS_MAGIC:
return "ramfs";
case TST_BTRFS_MAGIC:
return "btrfs";
case TST_XFS_MAGIC:
return "xfs";
case TST_EXT2_OLD_MAGIC:
return "ext2";
case TST_EXT234_MAGIC:
return "ext2/ext3/ext4";
case TST_MINIX_MAGIC:
case TST_MINIX_MAGIC2:
case TST_MINIX2_MAGIC:
case TST_MINIX2_MAGIC2:
case TST_MINIX3_MAGIC:
return "minix";
case TST_UDF_MAGIC:
return "udf";
case TST_SYSV2_MAGIC:
case TST_SYSV4_MAGIC:
return "sysv";
case TST_UFS_MAGIC:
case TST_UFS2_MAGIC:
return "ufs";
case TST_F2FS_MAGIC:
return "f2fs";
case TST_NILFS_MAGIC:
return "nilfs";
case TST_EXOFS_MAGIC:
return "exofs";
case TST_OVERLAYFS_MAGIC:
return "overlayfs";
case TST_FUSE_MAGIC:
return "fuse";
default:
return "unknown";
}
}
void print_filesystem(const char* path)
{
if (path == NULL)
return;
struct statfs s;
if (statfs(path, &s)) {
fprintf(stderr, "statfs(%s) failed: %sn", path, strerror(errno));
return;
}
printf("'%s' filesystem: %sn", path, tst_fs_type_name(s.f_type));
}
int main(int argc, char *argv[]) {
print_filesystem("/");
print_filesystem("/tmp");
return 0;
}
例:
$ gcc -Wall filesystem.c -o filesystem && ./filesystem
'/' filesystem: ext2/ext3/ext4
'/tmp' filesystem: tmpfs
相关文章:
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何传递多个 std::文件系统选项?
- 遍历顺序由 std::文件系统directory_iterator给出
- libstdc++ 文件系统中未初始化的用法?
- boost::文件系统::recursive_directory_iterator多线程安全
- C++17 文件系统::remove_all 带有通配符路径
- 实验性文件系统库不完整C++?
- 使用文件系统时仍然需要链接到带有 C++20 的 stdc++fs?
- 无法链接文件系统库C++
- 无法识别 Mac c++ 文件系统库
- 使用Boost文件系统C++将具有特定扩展名的文件的名称保存在特定文件夹中
- 获取 clang++:错误:在编译文件系统库的代码时
- C++17 文件系统在 Windows 10 上使用 nuwen MinGW
- C++ VS 错误:<实验/文件系统>提供 std::experimental::文件系统的标头已被Microsoft弃用,将被删除
- 如何修复 MinGW 文件系统探针?
- 将 boost::文件系统::p ath 转换为 char?
- 如何使用 Linux API for C 确定文件系统类型(名称)?
- 特定文件类型的文件系统筛选器驱动程序
- 在Linux的C/C++中,如何确定已安装或未安装分区的文件系统类型