我如何知道 USB 设备是否已在使用中?

How can I know if a USB device is already in use?

我正在使用 C 库 libusb 为 USB 设备编写 C++ Linux 用户空间驱动程序。我有同一设备的两个副本(相同的供应商 ID 和产品 ID),想知道如何处理这种情况。

以下是我能想到的可能性:


我该如何处理?在处理许多相同设备时,前面的哪个选项(如果有)是 libusb 的行为?如何区分使用中的设备和闲置的设备?


正如@fiscblog 在他的回答中所说,"Identification is done via the device descriptor (use the serialnumber which should always be unique)"。我的问题是,为了这样做,两个驱动程序应该进行通信以了解哪个实例正在处理哪个设备(例如,使用文件),我想避免这种情况。我还想避免引入多线程并用一个驱动程序管理两个设备,因为我不具备以高效且可控的方式这样做的技能(讨厌的竞争条件......!)

正确的处理方式是:

  • 枚举所有设备(获取设备列表)
  • 识别请求的设备并打开它

识别是通过设备描述符完成的(使用应该始终唯一的序列号),正如您自己发现的那样。

如何知道设备是否正在使用?

如果设备 已打开 ,将为 I/O 绑定和配置端点。因此您无法再次打开它,但会得到您提到的错误代码。

根据 libusb_claim_interface() 上的文档:

Interface claiming is used to instruct the underlying operating system that your application wishes to take ownership of the interface.

所以你应该能够在每台设备上调用 libusb_claim_interface() 并且它应该只在无人认领的设备上成功:

It is legal to attempt to claim an already-claimed interface, in which case libusb just returns 0 without doing anything.

libusb 是用 C 编写的,并遵循相同的访问设备、文件描述符、流等的基本通用准则。

1 - 连接到设备

2 - 检查连接,如果有错误,通知 return

3 - 没有错误!!互动

按照这个基本流程,恕我直言,您的解决方案非常简单:

  • 识别设备
  • 遍历它们尝试连接,直到没有抛出失败
  • 做点什么
  • 关闭