Задержка клавиатуры Linux

Итак, я хочу создать модуль ядра (я полагаю), который будет вставлять небольшую задержку после нажатия клавиши клавиатуры (скажем, 500 мс). Мне удалось сделать это в Windows с помощью хуков, но, похоже, в Linux все по-другому. Обратите внимание, что я не хочу использовать методы x11, так как я хочу, чтобы они также работали из консоли Linux (даже если X-сервер не запущен). Насколько я понял, потребуется собрать модуль ядра и динамически вставить его в ядро ​​с помощью insmod. Мне удалось построить кейлоггер, который бы сбрасывал каждую нажатую клавишу в журнал ядра, но вставка задержки потребовала бы отправки потока, обрабатывающего обработчик прерывания клавиатуры, в сон, что является очень плохой идеей, а также перезаписи всего USB_KBD драйвер, потому что текущий скрипт вызывает функцию request_irq с установленным флагом IRQF_SHARED, поэтому я предполагаю, что исходный драйвер все еще выполняет свою работу до выполнения моей функции.

В настоящее время я запрашиваю обработчик прерываний, подобный этому

request_irq (1, (irq_handler_t) irq_handler, IRQF_SHARED, "keyboard_stats_irq", (void *)(irq_handler));

Любые предложения о том, как справиться с этим (любым другим способом)?


person Vegstar    schedule 02.01.2018    source источник
comment
Я не понимаю часть ssh. ssh - это просто программа, ну клиент и сервер, но я не знаю, хотите ли вы замедлить работу клиента или сервера... Или вы имеете в виду, что хотите, чтобы он работал даже в консоли linux (когда X не запущен)?   -  person rodrigo    schedule 03.01.2018
comment
да, это то, что я пытался сказать, спасибо :) я хочу замедлить сервер, даже если X не запущен, и я ожидаю, что модуль будет работать и в X, учитывая, что я реализую его на уровне ядра   -  person Vegstar    schedule 03.01.2018


Ответы (1)


Вы можете написать демон пользовательского пространства, который считывает входные события с /dev/input/input* (независимо от устройства клавиатуры), одновременно захватывая устройство, чтобы блокировать события для прохождения через остальную часть системы (ioctl(fd, EVIOCGRAB, 1)).

Затем демон может создать виртуальное устройство ввода, используя /dev/uinput, и записать туда события ввода после некоторой задержки. Поскольку задержка будет реализована в пользовательском пространстве, это будет довольно просто.

Запуск вашего демона будет эквивалентен «горячему» подключению виртуальной клавиатуры, а современные X-серверы (менее 10 лет?) способны справляться с «горячим» подключением устройств ввода. И драйвер vconsole тоже отлично работает с ними.

person rodrigo    schedule 02.01.2018