我需要在程序中检索evdev设备的抓取状态。更具体地说,我需要检索这里看到的grab结构中的evdev指针的状态:https://elixir.bootlin.com/linux/v4.20/source/drivers/input/evdev.c#L42 (如果它是NULL或NULL)。这在用户空间中是完全可能的吗?例如,通过使用/dev/(k)mem读取内核内存,还是需要编写内核模块?我该从哪里开始呢?
发布于 2019-01-07 08:23:08
要确定设备当前是否被从用户空间抓取,您可以自己尝试抓取它;要么自己使用EVIOCGRAB ioctl,要么使用libevdev中的libevdev_grab:
if (!ioctl(evdevfd, EVIOCGRAB, (void *) 1)) {
// We grabbed the device, no one else had it; release it
ioctl(evdevfd, EVIOCGRAB, (void *) 0);
} else if (errno == EBUSY) {
// The device is busy, someone else has it
} else {
// Something else went wrong
}或
struct libevdev *dev;
libevdev_new_from_fd(evdevfd, &dev);
if (!libevdev_grab(dev, LIBEVDEV_GRAB)) {
// We grabbed the device, no one else had it; release it
libevdev_grab(dev, LIBEVDEV_UNGRAB);
} else if (errno == EBUSY) {
// The device is busy, someone else has it
} else {
// Something else went wrong
}(大量添加错误处理;evdevfd是您感兴趣的evdev设备的打开文件描述符。)
https://unix.stackexchange.com/questions/492909
复制相似问题