私のプログラムは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デバイスのオープンファイル記述子です。)