Я хочу создать программу на языке C, которая принимает входные данные с джойстика ( /dev/input/js0
), обрабатывает их, а затем отправляет их в файл поддельного устройства (символьныйилиблок) помечен как клавиатура (о, и чтоявляетсяфайл устройства для клавиатуры?. Я хотел бы узнать, возможно ли это сделать, и если да, то как.
решение1
Внимательно посмотрите на отрывок из ls -al /dev
команды в моей системе:
brw-rw---- 1 root floppy 8, 0 Jun 7 19:55 sda
brw-rw---- 1 root floppy 8, 1 Jun 7 19:55 sda1
brw-rw---- 1 root floppy 8, 2 Jun 7 19:55 sda2
brw-rw---- 1 root floppy 8, 3 Jun 7 19:55 sda3
brw-rw---- 1 root floppy 8, 5 Jun 7 19:56 sda5
brw-rw---- 1 root floppy 8, 6 Jun 7 19:56 sda6
brw-rw---- 1 root floppy 8, 7 Jun 7 19:56 sda7
brw-rw---- 1 root floppy 8, 8 Jun 7 19:57 sda8
brw-rw---- 1 root floppy 8, 16 Jun 7 19:55 sdb
brw-rw---- 1 root floppy 8, 32 Jun 7 19:55 sdc
brw-rw---- 1 root floppy 8, 33 Jun 7 19:55 sdc1
brw-rw---- 1 root floppy 8, 34 Jun 11 10:39 sdc2
brw-rw---- 1 root floppy 8, 35 Jun 7 19:56 sdc3
Две цифры после идентификатора группы, но перед датой — это основной и дополнительный номера файла устройства. По сути, это «вид» устройства. В данном случае 8 — это дисковод SCSI (или эмулируемый SCSI).
http://lxr.linux.no/linux/Documentation/devices.txtэто не совсем свежий список всех основных и второстепенных чисел. Не уверен в официальном местоположении последней версии списка.
Так или иначе, эти файлы создаются командой mknod
( mknod [OPTION]... NAME TYPE [MAJOR MINOR]
, некоторые типы b
для блока, c
для символа). Также есть mknod()
системный вызов. Я не совсем понимаю последствия, если вы создадите еще один файл с тем же мажором/минором, что и существующее устройство.
uinput
как описано в комментариях, вероятно, то, что вы ищете, хотя на оборудовании ПК есть , /dev/psaux
которое считывает/записывает напрямую в порт PS/2, если ваша система достаточно старая, чтобы иметь его. Не могу даже сказать вам, с чего начать с USB-клавиатурами ...
Если вам просто нужен файл поддельного устройства и вас не волнует, что происходит с данными, которые вы на него отправляете, всегда есть /dev/zero
. Также символические ссылки могут быть действительно простым решением в этом случае.