linux usb connect/disconnect事件

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帮助程序脚本.我甚至不确定这些是否会有所帮助.

Amb*_*jak 6

如果要在单个进程中完成所有操作,则必须使用libudev udevd从内核或直接从内核获取事件。

看到在您的应用程序中使用libudev可能是一个问题(缺少文档?),另一种方法是使用udevadm程序,该程序可以:

  • udevdudevadm monitor --udev --property)处理后报告设备事件,
  • 直接从内核(udevadm monitor --kernel --property)报告错误事件,并且
  • 转储udevd的当前设备数据库(但不转储内核的数据库!)(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才能运行。但是为什么这仍然是一个问题?(通过一些工作,可以删除此依赖项)