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