【问题标题】:Hot-plug in detect by Interrupt通过中断检测热插拔
【发布时间】:2017-05-25 18:08:29
【问题描述】:

我目前正在使用 udev 在我的应用程序中检测 USB 热插拔事件,但据我所知,它是一个轮询过程,它需要一个线程持续监控内核 uevent。 每当检测到 Hot-Plug 事件时,内核是否会通过中断通知我或向我的进程发出信号?

谢谢

【问题讨论】:

  • 你读过这个documentation吗?
  • 你目前的投票情况如何?
  • 使用 udevadm 监视器,我还通过创建 netlink 套接字来侦听 uevent 来做到这一点,但它仍然是一种轮询技术,在我的应用程序中已经有很多线程,而且多一个轮询线程对我来说代价高昂
  • 您可以创建一个udev 规则,以便在插入匹配设备时向您的进程发送信号

标签: c linux-kernel embedded-linux kernel-module udev


【解决方案1】:

首先编写一个 udev 规则来识别设备并在该设备连接到主机时运行脚本(操作)。

  1. 使用以下命令获取您设备的信息,在我的示例中,它是 USB 控制台适配器。这个命令会报告一堆东西,我们可以通过 udev 规则文件来识别热插拔设备。

$ udevadm info -a -n /dev/ttyUSB0

现在制作一个文件 - /etc/udev/rules.d/99-usbdev.rules,内容如下。

SUBSYSTEM=="tty", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="xxxx", ATTRS{product}=="USB 转 UART 桥接控制器", RUN+="/usr/bin/devattached.sh"

重新加载 udev 规则和服务:

$ udevadm control --reload-rules
$ systemctl restart udev.service

调试:如果 udev 规则不起作用!!

udevadm monitor --udev
  1. 使用您想要的操作创建一个脚本,并将其放在与“RUN+”中提供的完全相同的路径上。不要忘记为该脚本授予可执行权限。使用 pgrep 和 kill 命令将信号从脚本发送到您的进程。

【讨论】:

  • 如果多个进程同名@SD,如何在shell脚本中识别进程ID
  • 您应该在代码中getpid()您的进程并将其存储在某处并在需要时使用。
  • 我必须在检测到热插拔时向我的进程发出信号,我在我的脚本中使用 PID=pgrep myApp 但是如果多个同名进程正在运行怎么办,在这种情况下它总是向进程 ID 最低的进程
  • 你可以这样做 - printf("myApp process ID: %d\n", getpid());编写代码将此 pid 存储在文件系统的某个位置 - 例如在 /var/run/myApp.pid 文件中。从脚本中的 /var/run/myApp.pid 文件中读取 pid 并发送信号。
  • killall -s SIGNAL myApp 会将SIGNAL 发送到所有myApp 进程
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 2020-05-20
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多