linux libusb使用libusb_claim_interface失败(-6,Resource busy)解决方案
linux libusb使用libusb_claim_interface失败(-6,Resource busy)解决方案
- ✅ 问题原因
- 🛠️ 解决方案
- 🔸 方法一:分离内核驱动 libusb_detach_kernel_driver()
- 🔸 方法二:使用 usb-devices 和 lsmod 查看占用情况
- 🔸 方法三:使用 udev 禁止自动绑定内核驱动(可选)
在 Linux 上使用 libusb_claim_interface() 失败,返回错误 -6 (LIBUSB_ERROR_BUSY),说明该接口当前正被别的驱动或程序占用。以下是排查和解决这个问题的常用步骤:
✅ 问题原因
接口已被内核驱动占用(最常见,比如 usb-storage, usbhid, btusb, 等)。
另一个进程正在访问该设备。
设备没有正确分离内核驱动绑定。
🛠️ 解决方案
🔸 方法一:分离内核驱动 libusb_detach_kernel_driver()
在调用 libusb_claim_interface() 之前,使用:
if (libusb_kernel_driver_active(handle, interface_number)) {libusb_detach_kernel_driver(handle, interface_number);
}
完整代码示例:
libusb_device_handle *handle;
int interface_number = 0;libusb_init(NULL);
handle = libusb_open_device_with_vid_pid(NULL, 0x0a12, 0x0001); // 替换为你的 VID/PIDif (handle) {if (libusb_kernel_driver_active(handle, interface_number) == 1) {libusb_detach_kernel_driver(handle, interface_number);}int ret = libusb_claim_interface(handle, interface_number);if (ret != 0) {fprintf(stderr, "claim failed: %s\n", libusb_error_name(ret));} else {printf("Interface claimed successfully!\n");}
}
🔸 方法二:使用 usb-devices 和 lsmod 查看占用情况
查看是不是内核驱动在占用设备:
lsmod | grep btusb
也可以查看具体接口被绑定了哪个驱动:
usb-devices
或使用:
dmesg | grep usb
如果是 btusb 这样的驱动,你可以先移除内核模块:
sudo modprobe -r btusb
⚠️ 注意:这样会影响系统蓝牙功能,谨慎使用,特别是在系统依赖该功能时。
🔸 方法三:使用 udev 禁止自动绑定内核驱动(可选)
写一个规则防止内核自动绑定,比如用于蓝牙 dongle
sudo vim /etc/udev/rules.d/99-usb-nobind.rules
添加如下内容:
ATTR{idVendor}=="0a12", ATTR{idProduct}=="0001", DRIVER=="btusb", ATTR{authorized}="0"
然后重启 udev:
sudo udevadm control --reload
sudo udevadm trigger