使用 C++ 在 Linux 中监视磁盘安装的最佳方法?

Posted

技术标签:

【中文标题】使用 C++ 在 Linux 中监视磁盘安装的最佳方法?【英文标题】:Best way to monitor disk mounts in Linux using C++? 【发布时间】:2009-01-29 18:52:20 【问题描述】:

我目前正在构建一个 Carputer 前端,它需要的一个功能是能够识别何时插入外部媒体,例如 USB/SD 记忆棒或 iPod。插入后,我将扫描设备中的音乐/视频/图像并将它们添加到媒体库中。或者,我需要知道这些设备何时被移除,以便我可以从当前可用的媒体中移除添加的项目。

我的问题是,在 Linux 环境中使用 C++ 监控磁盘插入/移除的最佳方法是什么?

我可以监视 /media 文件夹以了解 Linux 何时自动挂载磁盘,但这是完成任务的最佳方式吗?感谢您的任何见解!

【问题讨论】:

【参考方案1】:

您可以阅读kernel uevents from a NetLink socket。它提供有关设备添加/删除、挂载/卸载的事件。

-- 网联

监听网络链接的守护进程 套接字接收一个数据包 每个热插拔事件,包含 用户模式助手的相同信息 将在环境中收到 变量。

netlink 数据包包含一组 以空结尾的文本行。首先 netlink 数据包的行结合 $ACTION$DEVPATH 值, 以@(at 符号)分隔。每个 第一个之后的行包含一个 KEYWORD=VALUE 对定义热插拔 事件变量。

[...]

动作

当前热插拔动作:“add”添加设备,“remove”移除 它。 2.6.22内核还可以生成“change”、“online”、 “离线”和“移动”操作。

您可能想要监控mountumount 的操作。请注意,事件不会为您提供设备节点或实际安装点,仅提供设备的 sysfs 节点。如果设备节点管理和挂载管理由外部进程(例如 udev)处理,您必须自己使用主要和次要设备号和/proc/mounts 找出设备节点和挂载点。

【讨论】:

我编写了简单的应用程序来打印 netlink 事件,但我没有看到任何挂载/卸载操作。只是addchange。例如,是否可以监视手动进行的挂载/卸载? 我不确定现在内核中有来自uevent 的任何mount 操作。好像是considered broken, and removed。【参考方案2】:

如果您的系统上正在运行hald,您可以观察org.freedesktop.Hal.Manager.DeviceAdded DBUS 信号。

Mounts 需要注意一些技巧,如果您无法控制 mounter,您可能需要轮询 /proc/mounts。我看不到任何从pmount 或gnome-volume-manager 获取通知的方法。 KDE 4 的Solid 可能为此提供了一个接口,但我还没有深入研究它。

【讨论】:

不幸的是,目标系统不会运行 Gnome 或 KDE,因为它的内存和处理能力有限。

以上是关于使用 C++ 在 Linux 中监视磁盘安装的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

寻找一种在 Unix C++ 中被动监视目录中文件活动的方法

c++ - 在 linux 中监控挂载文件夹

监视 ASP.NET 应用程序内存和磁盘使用情况

linux学习-linux性能检查工具

Ubuntu 14.04中如何查看磁盘空间使用情况

使用 C++ 在 Linux 中计算磁盘读/写