USB设备调用libusb库读写fd时报错
=====================

#### 问题现象

USB设备调用libusb库的ioctl函数进行设备读写时失败，返回错误码16，提示“文件已存在”或“资源已被占用”。

ioctl(hpriv \- \> fd, IOCTL\_USBFS\_SUBMITURB, urb); _// 失败，errno=16_

涉及到接口占用部分的问题代码示例参考如下：

*   TS侧USB初始化。
    
    initUUBar(device: usbManager.USBDevice){
      if(this.usbPipe != null){
        return
      }
      this.initEndpoints(device)
      this.usbPipe \= usbManager.connectDevice(device)
      usbManager.claimInterface(this.usbPipe,device.configs\[0\].interfaces\[0\])
      usbManager.setConfiguration(this.usbPipe,device.configs\[0\])
      usbManager.setInterface(this.usbPipe,device.configs\[0\].interfaces\[0\])
      this.usbPipeFd \= usbManager.getFileDescriptor(this.usbPipe)
    }
    
*   C++侧调用libusb库的ioctl函数进行设备读写。
    
    r \= ioctl(hpriv\-\>fd, IOCTL\_USBFS\_SUBMITURB, urb); _// 这里返回错误码16_
    if (r < 0) {
      free(urb);
      tpriv\-\>urbs \= NULL;
      if (errno \== ENODEV)
        return LIBUSB\_ERROR\_NO\_DEVICE;
      usbi\_err(TRANSFER\_CTX(transfer), "submiturb failed, errno=%d", errno); _// 这里返回错误码16_
      return LIBUSB\_ERROR\_IO;
    }
    

#### 解决方案

使用usbManager的claimInterface方法时，系统会独占该接口。其他进程（包括使用libusb的进程）将无法再访问该接口。所以使用libusb场景，不要调用usbManager提供的claimInterface等接口，否则会造成USB服务进程占用接口，其他进程使用时会报错。

#### 总结

使用libusb场景，不要调用usbManager提供的claimInterface等接口，否则会造成USB服务进程占用接口，其他进程使用时会报错。