evdev デバイスのクロール状態にアクセスします。

evdev デバイスのクロール状態にアクセスします。

私のプログラムはevdevデバイスのインポートステータスを取得する必要があります。具体的には、ここに示されている構造grabのポインタの状態を検索する必要がありますevdevhttps://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デバイスのオープンファイル記述子です。)

おすすめ記事