3

我如何从设备文件描述符中获取设备信息,包括设备名称?

例如,在 SKYPE 中,我可以看到设备“/dev/snd/pcmC2D0c”的名称为:“USB 2.0 Camera.USB Audio Default Audio Device (default:CARD=Camera)”

我如何使用 C++ 获得这样的设备名称?

int file = open("/dev/snd/pcmC2D0c", O_RDWR | O_NONBLOCK, 0);
if (-1 == file) // check is error occurred during opening?
{
    perror("open");
    return -1;
}
if (-1 == ioctl(file, /* appropriate ioctl value to get the device info? */, /* appropriate structure to fill with device info? */))
{
    perror("ioctl");
    return -1;
}
4

2 回答 2

4

没有ioctl用于获取设备信息的值。在这种特殊情况下,它是一个 USB 设备,它有其他设备类型信息来源。

您可以查看sysfs安装在/sys. 有一个目录/sys/bus/usb/devices/,其中包含指向真实设备的符号链接条目。

在我的系统上,有例如/sys/bus/usb/devices/3-4. 此符号链接指向目录/sys/devices/pci0000:00/0000:00:12.0/usb3/3-4/,该目录包含多个标识设备的文件。

idVendoridProduct包含数字045e00cb。使用这些数字,您可以查看文件/usr/share/misc/usb.ids并找到

...
045e  Microsoft Corp.
...
        00ca  Fingerprint Reader
        00cb  Basic Optical Mouse v2.0
        00ce  Generic PPC Flash device
...

例如,对于硬盘驱动器,您有类似的信息。/sys/devices/pci0000:00/0000:00:11.0/host0/target0:0:0/0:0:0:0/block/sda/是我的硬盘device/model,此目录中的条目包含字符串TOSHIBA DT01ACA1,将其标识为 THOSHIBA 1TB 硬盘驱动器。

于 2013-04-17T22:04:22.273 回答
1

某些 ioctl 不会检索设备信息(尽管通过链接许多 ioctl 可以做到这一点),而是通过 sysfs 和/或 udev。您可以使用命令行工具/sbin/udevadm查询有关设备的信息。udev 将有效地遍历 sysfs 并从那里查询所有信息。但为方便起见,这由 udev 抽象出来。

在 /dev 中的任意条目上尝试以下操作

/sbin/udevadm info --query all --name=/dev/...

在 udev API http://www.freedesktop.org/software/systemd/libudev/中有一个等价物

于 2013-04-17T22:04:20.007 回答