evdev 장치의 크롤링 상태에 액세스합니다.

evdev 장치의 크롤링 상태에 액세스합니다.

내 프로그램에서 evdev 장치의 가져오기 상태를 검색해야 합니다. 더 구체적으로 말하면 여기에 표시된 구조 grab의 포인터 상태를 검색해야 합니다 evdev.https://elixir.bootlin.com/linux/v4.20/source/drivers/input/evdev.c#L42(NULL이거나 NULL이 아닌 경우) 예를 들어 /dev/(k)mem을 사용하여 커널 메모리를 읽어 사용자 공간에서 이것이 가능합니까, 아니면 커널 모듈을 작성해야 합니까? 어디서부터 시작해야 할까요?

답변1

장치가 현재 크롤링되고 있는지 확인하려면 사용자 공간에서 직접 크롤링을 시도하거나 EVIOCGRAB ioctl다음 libevdev_grab에서 크롤링을 시도할 수 있습니다 libevdev.

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 장치의 열린 파일 설명자입니다.)

관련 정보