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

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

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

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

【问题讨论】:

    标签: c++ 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。我看不到任何从pmountgnome-volume-manager 获取通知的方法。 KDE 4 的Solid 可能为此提供了一个接口,但我还没有深入研究它。

    【讨论】:

    • 不幸的是,目标系统不会运行 Gnome 或 KDE,因为它的内存和处理能力有限。
    猜你喜欢
    • 2013-08-16
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2018-08-21
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多