如果您想在单个进程中处理所有内容,则必须使用 libudev 从 udevd 或直接从内核获取事件。
看到在您的应用程序中使用 libudev 可能会出现问题(缺少文档?),另一种方法是使用 udevadm 程序,它可以:
- 经过
udevd(udevadm monitor --udev --property)处理后上报设备事件,
- 直接从内核报告设备事件 (
udevadm monitor --kernel --property),并且
- 转储 udevd 的当前设备数据库(但不是内核的!) (
udevadm info --query all --export-db)
udevadm 是 udev 包的一部分,但如果您只使用它来报告内核事件,则不需要udevd。您可以通过让您的进程生成它并解析其标准输出来使用它(但您必须通过 stdbuf -o L 启动它)。
不管怎样,这可能需要大量的工作。我已经在我的NCD programming language 中实现了很多这样的功能,包括监控 USB 设备。您可能想看看 NCD;它对许多配置任务很有用,并且可以很好地处理热插拔。例如,这个 NCD 程序会将 USB 设备事件打印到标准输出:
process main {
sys.watch_usb() watcher;
println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id);
watcher->nextevent();
}
这将使 NCD 打印类似的内容(对于已插入的任何 USB 设备,初始 added 事件):
added /dev/bus/usb/002/045 0409:0059
added /dev/bus/usb/002/046 046d:c313
added /dev/bus/usb/002/047 046d:c03e
added /dev/bus/usb/002/048 0557:2008
removed /dev/bus/usb/002/048 0557:2008
您也可以为此使用 NCD,并解析 this 标准输出 - 这比直接使用 udevadm 更容易使用。
请注意,NCD 本身使用udevadm,并且它确实需要运行 udevd;但为什么这是一个问题呢? (通过一些工作可以删除这种依赖关系)