Как получить имя (путь) устройства, созданного 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
Это даст вам любое из этих значений по запросу...