将事件添加到 Udev 事件队列

将事件添加到 Udev 事件队列

我的 udev 规则之一运行一个有关删除 USB 存储设备的脚本。此脚本执行一些常规清理并删除存储设备的安装点目录。问题是我希望能够从我的 C++ 应用程序以编程方式触发此逻辑(而不是在 USB 闪存驱动器被热插拔移除时触发,这似乎为时已晚)。

实现这一点的正确方法似乎是直接将事件添加到 udev 事件队列上。我能够使用 udevadm 实现所需的操作,但在 libudev 库中没有看到等效的 API。

udevadm trigger --action=remove --property-match=DEVNAME=/dev/sda1

有没有办法通过 dbus 访问 udev 来实现这一点?有没有一个图书馆可以让我这样做?这最终不是 udev 应该如何工作吗?我应该卸载并清理应用程序中的块设备,而不是让 udev 这样做吗?

答案1

看来您正在寻找的是sysfs 文件系统uevent中的伪文件/sys

通过向该文件写入命令(例如"remove"),内核会将这些命令转发到设备事件的用户空间处理程序,即 udevd。

因此,执行与以下代码片段等效的操作(以 shell 为例)应该可以完成您想要的操作,请求 udev 删除设备/dev/sda1

# echo -n "remove" >/sys/class/block/sda1/uevent

您可以使用 libudev API(例如,udev_device_get_syspath(3)帮助您找到给定设备的正确 sysfs 路径。

您可以在下面找到内核方面的一些文档对象

您还可以在 udev 的文档中找到一些提及“uevents”的内容,例如“systemd-udevd 监听内核 uevents”udevd 的手册页

但似乎没有很多关于ueventsysfs 伪文件的文档......

相关内容