我如何从设备文件描述符中获取设备信息,包括设备名称?
例如,在SKYPE中,我可以看到设备“/ dev / snd / pcmC2D0c”的名称为:“USB 2.0 Camera.USB Audio Default Audio Device(默认值: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;
}
答案 0 :(得分:3)
获取设备信息没有ioctl
值。在这种特殊情况下,它是一个USB设备,它有其他设备类型信息来源。
您可以查看安装在sysfs
的{{1}}文件系统。有一个目录/sys
,其中包含指向真实设备的符号链接条目。
在我的系统上,例如/sys/bus/usb/devices/
。此符号链接指向目录/sys/bus/usb/devices/3-4
,该目录包含多个标识设备的文件。
/sys/devices/pci0000:00/0000:00:12.0/usb3/3-4/
和idVendor
包含数字idProduct
和045e
。使用这些数字,您可以查看文件00cb
并找到
/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
,将其标识为THOSHIBA 1TB硬盘驱动器。
答案 1 :(得分: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/
中有相当的内容