使用 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”、 “离线”和“移动”操作。
您可能想要监控mount
和umount
的操作。请注意,事件不会为您提供设备节点或实际安装点,仅提供设备的 sysfs 节点。如果设备节点管理和挂载管理由外部进程(例如 udev)处理,您必须自己使用主要和次要设备号和/proc/mounts
找出设备节点和挂载点。
【讨论】:
我编写了简单的应用程序来打印 netlink 事件,但我没有看到任何挂载/卸载操作。只是add
和change
。例如,是否可以监视手动进行的挂载/卸载?
我不确定现在内核中有来自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 中监视磁盘安装的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章