Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C编程[Linux]中获取设备名称_C_Linux - Fatal编程技术网

在C编程[Linux]中获取设备名称

在C编程[Linux]中获取设备名称,c,linux,C,Linux,这个问题可能涉及面很广。然而,一个公认的答案就足够了 有没有聪明的方法来获取设备名(/dev/input/)? 目前我正在做的就是: char name[256] = "Unknown"; char *device = "/dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd"; // Open device & get file descriptor if ((fd = open (device, O_RDONLY | O_NONBL

这个问题可能涉及面很广。然而,一个公认的答案就足够了

有没有聪明的方法来获取设备名(
/dev/input/
)? 目前我正在做的就是:

char name[256] = "Unknown";
char *device = "/dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd";

// Open device & get file descriptor
if ((fd = open (device, O_RDONLY | O_NONBLOCK)) == -1)
{
    ...
}

// Get device name
ioctl (fd, EVIOCGNAME (sizeof (name)), name);
是否有更直接的方法获取设备名称?我想跳过为了获得设备名而必须打开文件的部分

原因是我正在浏览该文件夹中的所有设备,以找到匹配的设备名称

可能类似于此(Python),但在C语言中:

from evdev import InputDevice,list_devices

devices = map(InputDevice, list_devices())

for dev in devices:
    print dev.fn+" - "+dev.name
    if "SomeDevicaName" in dev.name:
        infile_path = dev.fn

我发现获取它的最简单方法是读取
/proc/bus/input/devices
并从Name字段中解析它

例如,我关注的输入设备显示如下

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="gpio-keys"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/platform/gpio-keys/input/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=3
B: KEY=300000 0 0 78000000 0
然后我可以在名称上匹配它,以避免迭代和打开每个输入设备。当然,如果你的输入设备被快速添加和删除,这是一场TOCTOU竞赛;打开设备后,仍应使用ioctl检查名称


在解释其他元素方面做得很好。

如果不提供设备名称的文件描述符,您如何知道要检索哪个设备名称?例如,我有一个给定的名称,希望找到匹配项。因此,我循环遍历“/dev/input/by id/”中的所有名称。我认为有一个命令可以直接检索设备名。所以我可以跳过打开文件、获取文件名、关闭文件的步骤。也许我现在太懒了。但在python中,有这样一个函数:P@ezFreak这在Python中是什么函数?哪一个模块?我刚才提到我看到了用python实现这一点的一种简单方法。这是C。对不起,你说的模块是什么意思?你可以在
/sys/class/input/event/device/name