使用c ++从设备文件描述符中检索Linux中的设备信息

时间:2013-04-17 21:40:26

标签: c++ linux

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

例如,在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;
}

2 个答案:

答案 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包含数字idProduct045e。使用这些数字,您可以查看文件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/

中有相当的内容