直接读取/proc/mounts文件即可,用std::ifstream逐行读取并以>>操作符安全提取前4字段(device、mount_point、fs_type、options),自动跳过多空格,无需手动解析或依赖getmntent()。

直接读取 /proc/mounts 文件即可,无需系统调用或库函数封装
Linux 的 /proc/mounts 是一个只读伪文件,本质是内核动态生成的文本快照,格式固定(空格分隔的 6 列),C++ 完全可以用标准文件流读取。它比 getmntent() 更轻量、更可控,也避开了 <mntent.h></mntent.h> 的依赖和内存管理细节。
常见错误是试图用 fopen() 后手动解析每行却忽略字段含空格(如挂载选项 relatime,strictatime)——其实第 4 列(挂载选项)本身允许含逗号但不含空格,真正要小心的是第 3 列(文件系统类型)和第 5/6 列(dump/pass)永远是单个词,所以按空格切分前 4 列是安全的。
- 用
std::ifstream打开/proc/mounts,逐行读取 - 对每行用
std::istringstream拆分,只取前 4 个字段:device、mount_point、fs_type、options - 跳过以
#开头的注释行(实际中极少出现,但规范起见建议判断) - 注意路径字段(
mount_point)已做 shell 解码(如\040→ 空格),无需额外处理
用 std::getline + std::istringstream 解析比手写 strtok 更可靠
因为 /proc/mounts 每行字段间是**多个连续空格**(不是制表符),且第 4 列(options)内部用逗号分隔,不能简单按空格全切。标准流的 >> 提取操作符会自动跳过多余空白,天然适配这种格式。
示例关键片段:
std::ifstream mounts("/proc/mounts");
std::string line;
while (std::getline(mounts, line)) {
if (line.empty() || line[0] == '#') continue;
std::istringstream iss(line);
std::string dev, mp, fstype, opts;
if (iss >> dev >> mp >> fstype >> opts) {
// 此时 mp 就是挂载点路径,如 "/home" 或 "/"
std::cout
- 不用
strtok:它会破坏原字符串,且对多空格不鲁棒 - 不推荐正则:小文件没必要,且 C++11
<regex></regex>在部分旧 glibc 上性能差 - 如果需进一步拆解
opts(如检查是否含noexec),用std::stringstream按逗号分割即可
注意权限与挂载命名空间隔离问题
普通用户可读 /proc/mounts,但看到的内容取决于当前进程所处的 mount namespace。容器内或 unshare 创建的 namespace 中,该文件只反映本 namespace 的挂载视图,而非宿主机全局状态。
- 在 Docker 容器中运行此代码,默认只能看到容器自己的挂载点(如
/proc,/dev/pts),看不到宿主机的/home或/data - 若需宿主机视角,必须在 privileged 容器中运行,或通过 hostPath 挂载宿主机
/proc(不推荐) - 没有 root 权限时无法挂载新设备,但读取
/proc/mounts不受影响
对比 getmntent():何时该换用 C 标准库接口
如果你需要过滤特定文件系统类型(如只取 ext4 或 nfs),或要获取更底层字段(如 mnt_freq, mnt_passno),getmntent() 更语义清晰;但它的返回结构体字段是裸指针,需注意生命周期,且在 musl libc 下行为略有差异。
- 用
getmntent()时,必须配对调用setmntent()/endmntent(),否则可能泄漏 FILE* -
/proc/mounts和/etc/fstab格式一致,但getmntent("/proc/mounts", "r")可直接读,不必硬编码路径 - 纯 C++ 项目想避免 C 风格 API?坚持用 ifstream —— 差异仅在于少几行代码,无实质性能损失
实际最易被忽略的是 mount namespace 上下文 —— 同一段代码,在 systemd service、podman 容器、chroot 环境里读出来的结果可能完全不同,调试时别只盯着解析逻辑,先确认 ls /proc/self/ns/mnt 和宿主机是否一致。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











