Linux的USB连接/断开事件
你好我的工作与使用用于USB联网g_ether驱动程序的USB端口的嵌入式Linux设备上。Linux的USB连接/断开事件
当USB插头连接在dmesg的输出是:
g_ether小工具:全速配置#2:RNDIS
当USB电缆被拔掉没有消息被写入到dmesg的。
用C我怎么能监听连接/断开事件?
嵌入式Linux操作系统没有任何附加功能。没有dbus守护进程或hotplug帮助脚本。我甚至不确定这些是否会有帮助。
如果您希望在单个进程中执行所有操作,则必须使用libudev从udevd
或直接从内核获取事件。
看,这可能是在您的应用程序(?缺乏文档)使用libudev问题,另一种是使用udevadm程序,它可以:通过udevd
处理后
- 报告设备事件(
udevadm monitor --udev --property
) - 报告devive直接从内核(
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打印类似的东西(与初始added
事件对于已经任何USB设备插入):
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来解决这个问题,并且解析这个标准输出 - 比直接使用udevadm更容易。
请注意,NCD本身使用udevadm
,它确实需要udevd运行;但为什么这是一个问题呢? (有些工作可以删除此依赖关系)
您可以使用libudev
或解析udevadm
输出为@Ambroz Bizjak建议。虽然,我建议不要添加额外的进程(stdbuf
)和语言(NCD
),只是为了解析udevadm的输出。
plain libudev和解析输出之间的一个步骤是修改udevadm源。该解决方案减少了所需的资源,并完全跳过了解析过程。当您查看udev软件包时,您会在udev
目录中找到udevd和udevadm的来源。
在那里,你有udevadm.c
的主程序,udevadm-monitor.c
为udevadm monitor
源。收到的每个活动都将通过print_device()
打印。这是你插入你的代码的地方。
如果你的内存是紧张,可以去掉不需要的代码control
,info
,settle
,test-builtin
,test
和trigger
。在我的系统(Ubuntu 12.04)上,这将udevadm的大小减少了大约75%。
不幸的是,在连接/断开连接上没有产生udev事件,所以几乎不可能监视这些事件。
你可以监视内核消息(这似乎是疯狂的想法)。可能更好的方法是修改内核。
更新:我不明白为什么这个答案得到了负面评价。
也许有些人将USB主机部分(在设备插入/拔出时产生UDEV事件)和USB设备/小工具部分(不会产生此类事件)混合使用
因此,如果您的Linux计算机作为小工具(USB设备连接到一些USB主机)没有好的方法来捕捉插拔事件。
来源?你能解释一下你的推理和从哪里开始实施吗? – bschlueter
我编辑了我的答案以获得更详细的解释。如果您决定观看内核消息,则可以看到如何在dmesg源代码中继续/ proc/kmsg,或者可以使用某些syslog守护进程PLUS日志文件监视程序(如swatch)。 – edo1
你至少有udev吗? – Keith
不幸的是我没有。在没有udev的用户模式下,不可能听到这种类型的事件吗? –
我相信这是获取内核事件的最佳方式。另一种方法是在[linux-hotplug](http://linux-hotplug.sourceforge.net/)中的旧版usbd。 – Keith