Как получить имя (путь) устройства, созданного uinput

Я успешно настроил небольшую программу для создания устройства ввода данных, которое планирую использовать для автоматизации тестирования приложения, получающего события ввода с клавиатуры.

Я следовал за обоими уроками, как найдено в этом очень хорошем ответе.

Когда моя программа создает устройство uinput путем вызова ioctl(fd, UI_DEV_CREATE) в файловой системе появляется новое устройство, поэтому тестируемое приложение может подключиться к нему и ждать событий. Моя целевая система уже имеет /dev/input/event0 устройство, так что новый получает путь /dev/input/event1, Если я компилирую и запускаю программу для моей настольной системы, где есть существующие устройства /dev/input/event[0-15]при запуске программы новое устройство получает /dev/input/event16,

Я хочу, чтобы моя программа сообщала имя нового устройства после его создания. Есть ли способ получить это?

1 ответ

Решение

Да, вы можете использовать UI_GET_SYSNAME (определено в /usr/include/linux/uinput.h) если он доступен на вашей платформе (например, Android по какой-то причине не определяет его). Это даст вам имя для устройства, созданного в /sys/devices/virtual/input, Как только вы узнаете устройство в sysfs, вы сможете выяснить, какие устройства созданы в /dev/input прочитав этот ТАК вопрос.

Используйте это после звонка UI_DEV_CREATE вот так (без проверки ошибок / исправности):

ioctl(fd, UI_DEV_CREATE);

char sysfs_device_name[16];
ioctl(fd, UI_GET_SYSNAME(sizeof(sysfs_device_name)), sysfs_device_name);
printf("/sys/devices/virtual/input/%s\n", sysfs_device_name);

Если он недоступен, попробуйте поискать устройство sysfs в /proc/bus/input/devices который должен содержать такую ​​запись:

I: Bus=0006 Vendor=0001 Product=0001 Version=0001
N: Name="your-uinput-device-name"
P: Phys=
S: Sysfs=/devices/virtual/input/input12
U: Uniq=
H: Handlers=sysrq kbd mouse0 event11 
B: PROP=0
B: EV=7
B: KEY=70000 0 0 0 0 0 7ffff ffffffff fffffffe
B: REL=143

... что немного грязнее Но, как вы можете видеть, это также даст вам ярлык для устройства, созданного в /dev/input,

Я был в лодке, не имея UI_GET_SYSNAMEу меня работает функция (она выполнила, но ничего не вернула). Кроме того, мне нужен "путь обработчика событий", который представляет собой другое (хотя и связанное) динамическое значение. Таким образом, я вынужден был допустить уродство синтаксического анализа/proc/bus/input/devices файл.

Я разместил свой парсер bash для этого в следующем потоке StackExchange: https://unix.stackexchange.com/questions/82064/how-to-get-the-actual-keyboard-device-given-the-output-of-proc-bus-input-device/507209

Это даст вам любое из этих значений по запросу...

Другие вопросы по тегам