【问题标题】:Retrieve device information in Linux from device file descriptor using c++使用c ++从设备文件描述符中检索Linux中的设备信息
【发布时间】:2013-04-17 21:40:26
【问题描述】:

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

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

【问题讨论】:

  • 您可以使用fstat(2) 来获取设备的设备ID,但这可能不是很有帮助。

标签: c++ linux


【解决方案1】:

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

您可以查看安装在/sys 的sysfs 文件系统。有一个目录/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 包含字符串 TOSHIBA DT01ACA1,将其标识为 THOSHIBA 1TB 硬盘驱动器。

【讨论】:

  • 谢谢你们的回答!
【解决方案2】:

设备信息不是由某些 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/ 中有一个等价物

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2015-04-22
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多