eat*_*mon 10 c linux usb networking driver
您好我正在使用嵌入式Linux设备,其USB端口使用g_ether驱动程序进行USB网络连接.
连接usb插头时,dmesg输出为:
g_ether小工具:全速配置#2:RNDIS
当USB电缆拔出时,没有消息写入dmesg.
使用C我如何监听连接/断开连接事件?
嵌入式Linux操作系统没有任何附加功能.没有dbus守护程序或hotplug帮助程序脚本.我甚至不确定这些是否会有所帮助.
如果要在单个进程中完成所有操作,则必须使用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编程语言实现了很多功能,包括监视USB设备。您可能想看一下NCD。它对于许多配置任务很有用,并且可以很好地处理热插拔。例如,此NCD程序会将USB设备事件打印到标准输出:
process main {
sys.watch_usb() watcher;
println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id);
watcher->nextevent();
}
Run Code Online (Sandbox Code Playgroud)
这将使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
Run Code Online (Sandbox Code Playgroud)
您也可以为此使用NCD并解析此标准输出-与直接弄乱udevadm相比,使用它要容易得多。
注意,NCD本身使用udevadm,并且确实需要udevd才能运行。但是为什么这仍然是一个问题?(通过一些工作,可以删除此依赖项)