您好我正在使用带有usb端口的嵌入式linux设备,该端口使用g_ether驱动程序进行USB网络连接。
连接usb插头后,dmesg输出为:
g_ether小工具:全速配置#2:RNDIS
拔下usb线时,没有信息写入dmesg。
使用C我如何监听连接/断开连接事件?
嵌入式Linux操作系统没有任何附加功能。没有dbus守护程序或hotplug帮助程序脚本。我甚至不确定这些是否会有所帮助。
答案 0 :(得分:5)
如果您希望单个流程中的所有内容,则必须使用libudev从udevd
或直接从内核获取事件。
看到在您的应用程序中使用libudev可能有问题(缺少文档?),另一种方法是使用udevadm程序,该程序可以:
udevd
(udevadm monitor --udev --property
),udevadm monitor --kernel --property
)和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,并解析此标准输出 - 这比直接使用udevadm更容易使用。
请注意,NCD本身使用udevadm
, 要求udevd运行;但是为什么这个问题呢? (有些工作可以删除这种依赖)
答案 1 :(得分:3)
您可以使用libudev
或解析udevadm
输出@Ambroz Bizjak建议。虽然,我建议不要添加额外的进程(stdbuf
)和语言(NCD
),只是为了解析udevadm的输出。
普通libudev和解析输出之间的步骤是修改udevadm源。该解决方案减少了所需的资源并完全跳过了解析过程。查看udev包时,您将在udev
目录中找到udevd和udevadm的源代码。
在那里,您拥有udevadm.c
中的主例程和udevadm monitor
中udevadm-monitor.c
的来源。收到的每个活动都将通过print_device()
打印。这是您插入代码的地方。
如果你的内存紧张,你可以删除control
,info
,settle
,test-builtin
,test
和{{}不需要的代码1}}。在我的系统(Ubuntu 12.04)上,这会将udevadm的大小减少大约75%。
答案 2 :(得分:-1)
不幸的是,连接/断开连接时没有产生udev事件,因此几乎不可能监视这些事件。
你可以监控内核消息(这似乎是疯狂的想法)。可能更好的方法是修改内核。
更新:我不明白为什么这个答案得到负面评价
也许有人混合USB主机部分(在设备插拔/拔出时产生UDEV事件)和USB设备/小工具部分(不会产生此类事件)
因此,如果您的Linux计算机作为小工具(连接到某些USB主机的USB设备)工作,则无法捕获插拔事件。