Linux обработка нажатия клавиш

Содержание
  1. unixforum.org
  2. как на Си реализовать обработчик нажатия клавиш (как на Си реализовать обработчик нажатия клавиш)
  3. как на Си реализовать обработчик нажатия клавиш
  4. Re: как на Си реализовать обработчик нажатия клавиш
  5. Re: как на Си реализовать обработчик нажатия клавиш
  6. Re: как на Си реализовать обработчик нажатия клавиш
  7. Re: как на Си реализовать обработчик нажатия клавиш
  8. Re: как на Си реализовать обработчик нажатия клавиш
  9. Re: как на Си реализовать обработчик нажатия клавиш
  10. Re: как на Си реализовать обработчик нажатия клавиш
  11. Re: как на Си реализовать обработчик нажатия клавиш
  12. Re: как на Си реализовать обработчик нажатия клавиш
  13. Re: как на Си реализовать обработчик нажатия клавиш
  14. Re: как на Си реализовать обработчик нажатия клавиш
  15. Re: как на Си реализовать обработчик нажатия клавиш
  16. Re: как на Си реализовать обработчик нажатия клавиш
  17. Re: как на Си реализовать обработчик нажатия клавиш
  18. Re: как на Си реализовать обработчик нажатия клавиш
  19. Re: как на Си реализовать обработчик нажатия клавиш
  20. Re: как на Си реализовать обработчик нажатия клавиш
  21. Re: как на Си реализовать обработчик нажатия клавиш
  22. Re: как на Си реализовать обработчик нажатия клавиш
  23. Re: как на Си реализовать обработчик нажатия клавиш
  24. Re: как на Си реализовать обработчик нажатия клавиш
  25. Re: как на Си реализовать обработчик нажатия клавиш
  26. Re: как на Си реализовать обработчик нажатия клавиш
  27. Re: как на Си реализовать обработчик нажатия клавиш

unixforum.org

как на Си реализовать обработчик нажатия клавиш (как на Си реализовать обработчик нажатия клавиш)

как на Си реализовать обработчик нажатия клавиш

Сообщение v4567 » 15.07.2015 14:48

Подскажите или натолкните на мысль, или на какой нибудь нормальный материал по данному вопросу.
Необходимо в виде линуксовой библиотеки написанной строго на Си (именно на Си не на Си++) реализовать обработчик нажатия клавиш. Что бы при помощи библиотеки можно было отловить нажатия некоторых клавиш.
За помощь заранее благодарен!

Bizdelnick Модератор Сообщения: 20387 Статус: nulla salus bello ОС: Debian GNU/Linux

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение Bizdelnick » 15.07.2015 14:58

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение v4567 » 15.07.2015 15:11

Запускается некоторая программа, которая написана не на Си и не на Си++ эта программа может вызывать библиотеки написанные на Си и использовать их.
Программа запускается в эмуляторе консоли — konsole она так же использует библиотеку ncurses.
Отвечая на Ваш вопрос — получается что в иксах.

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение v4567 » 15.07.2015 15:17

В самой программе конечно можно реализовать ввод с клавиатуры, но он реализован не очень хорошо.
Есть функция которая при запуске ждёт ввода, при этом вся программа то же стоит и ждёт ввода.
Мне же нужно реализовать обработку прерываний от клавиатуры, потому что я не знаю в какой именно момент выполнения программы будет нажата какая нибудь клавиша. В самом языке нету функций для работы с прерываниями. Если интересно что за язык — язык интерпретируемый mumps — gt.m

Bizdelnick Модератор Сообщения: 20387 Статус: nulla salus bello ОС: Debian GNU/Linux

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение Bizdelnick » 15.07.2015 15:31

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение v4567 » 15.07.2015 15:36

Читайте также:  Check point linux snx

Bizdelnick Модератор Сообщения: 20387 Статус: nulla salus bello ОС: Debian GNU/Linux

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение Bizdelnick » 15.07.2015 15:40

Получится, но будет значительно сложнее. Фактически надо будет сделать свою реализацию того же самого. Какой смысл?

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение v4567 » 15.07.2015 15:43

Может можно при помощи системных вызовов ядра как то реализовать?

>> Получится, но будет значительно сложнее.

в двух словах хотя бы подскажите как

буду смотреть в сторону ncurses
Спасибо за помощь!

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение v4567 » 15.07.2015 16:09

Мне надо по сути делать обработку прерывания от клавиатуры.
То есть не так что программа остановилась и ждёт ввода. Насколько я понял getch работает именно так, или я ошибаюсь?

eddy Сообщения: 3321 Статус: Красный глаз тролля ОС: ArchLinux Контактная информация:

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение eddy » 15.07.2015 16:33

Bizdelnick Модератор Сообщения: 20387 Статус: nulla salus bello ОС: Debian GNU/Linux

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение Bizdelnick » 15.07.2015 16:40

То есть не так что программа остановилась и ждёт ввода. Насколько я понял getch работает именно так, или я ошибаюсь?

 The getch, wgetch, mvgetch and mvwgetch, routines read a character from the window. In no-delay mode, if no input is waiting, the value ERR is returned. In delay mode, the program waits until the system passes text through to the program.
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение s.xbatob » 15.07.2015 17:01

Вы свои требования высказали достаточно невразумительно. Но в любом случае это сложнее, чем кажется. Самое простое и близкое к тому, что вы написали — написать простое графическое приложение, в котором обрабатывать KeyPressEvent и KeyReleaseEvent. Если же вам нужно обрабатывать нажатие клавиши в «традиционном стиле» — как пришедший символ от терминала, то тут достаточно установить режим cbreak (что getch наверное и делает)
Но если вам надо одновременно ждать эти нажатия и делать что-либо ещё (или вообще делать несколько дел одновременно) — то это уже совсем другая задача. Тут надо либо разбиваться на потоки, либо организовывать свою задачу как управляемую событиями (а лучше — и то, и другое) Она не имеет прямого отношения ни к интерфейсу к системе, ни к языку программирования.
P.S. Ну и запускать в графической среде эмулятор символьного терминала, а в нём псевдографическое приложение — это извращение.

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение yars » 15.07.2015 18:54

А мне что делать, если я в эмуляторе терминала запускаю консольный mc? Бежать на графический ФМ? Нафига? И что с того, что он псевдографический?

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение s.xbatob » 15.07.2015 22:23

А мне что делать, если я в эмуляторе терминала запускаю консольный mc? Бежать на графический ФМ? Нафига? И что с того, что он псевдографический?

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение yoshakar » 16.07.2015 00:04

То есть, по-вашему, каждый раз при запуске псевдографического приложения надо обязательно переключаться в тру-консоль? Это хуже чем извращение, это просто идиотизм.
Или вообще не пользоваться псевдографическими приложениями? Иметь две программы — одна псевдографическая, полнофункциональная и удобная, с красивыйм и продуманным интерфейсом, и вторая — с урезанным функционалом, кривая, страшная и глючна — и пользоваться при этом именно последней — опять же идиотизм чистой воды.

Читайте также:  Reaver and kali linux

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение s.xbatob » 16.07.2015 09:29

Повторяю для непонятливых: запускать в графической среде эмулятор символьного терминала, а в нём псевдографическое приложение — это извращение.
И прошу не искажать и не фантазировать на эту тему.
И состояние и темпы развития многочисленных графических библиотек и когда-то не менее многочисленных, но давно вымерших, псевдографических — это подтверждает.

eddy Сообщения: 3321 Статус: Красный глаз тролля ОС: ArchLinux Контактная информация:

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение eddy » 16.07.2015 11:18

запускать в графической среде эмулятор символьного терминала, а в нём псевдографическое приложение — это извращение.

Говорить такое — вот истинное извращение!
Про mc пример был правильный. В линуксе нет (и, наверное, не будет — т.к. не надо, ведь есть mc!) ни одного хотя бы отдаленно напоминающего mc графического ФМ. Вот, скажем, у меня на работе на основном мониторе обычно geany с кодом открыт, а на дополнительном — xfce4-terminal с запущенным там mc. В geany код правлю, в mc по ФС навигацию осуществляю, а также запускаю make и т.п.

Bizdelnick Модератор Сообщения: 20387 Статус: nulla salus bello ОС: Debian GNU/Linux

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение Bizdelnick » 16.07.2015 12:06

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

eddy Сообщения: 3321 Статус: Красный глаз тролля ОС: ArchLinux Контактная информация:

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение eddy » 16.07.2015 13:57

Дык, по теме все уже сказали: select — чтобы узнать, не было ли активности; ~(ICANON | ECHO) — чтобы не было «эха».

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение sabir » 18.07.2015 14:06

#include #include #include #include #include #define EV_PRESSED 1 int quit = 0; int keyboard; int init_keyboard() < char *device = "/dev/input/event10"; if((getuid()) != 0) < printf("You are not root! This may not work. \n"); return -1; >if((keyboard = open(device, O_RDONLY)) == -1) < printf("%s is not a vaild device.\n", device); return -1; >return 0; > void * update_keyboard() < struct input_event event; while(1) < read(keyboard, &event, sizeof(struct input_event)); if(event.type == EV_KEY) < if(event.value == EV_PRESSED) < if(event.code == KEY_ESC) quit = 1; >> > > int main() < if(init_keyboard() != 0) return -1; pthread_t thread; int int result = 0; result = pthread_create(&thread, NULL, update_keyboard, &id); if(result != 0) < printf("Create thread failed\n"); return -1; >while(!quit) < // тута выполняется страшно важная и полезная работа >return 0; >

Обработчик клавиатуры запускается в отдельном процессе, не мешая работе основной программы. pthread_create — богомерзкая обертка над православным clone(), так же можно заюзать православный fork()
Код ожидает нажатия кнопки ‘ESC’, в качестве примера.
Работает только если есть права root или если поменять владельца «/dev/input/event10», где ‘event10’ клавиатура

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение yoshakar » 18.07.2015 14:17

Таки всё-таки в отдельном треде, а не процессе. Вот если заюзать fork() — то будет в отдельном процессе. Кстати, задавшись вопросом, можно ли сделать по-номальному, без лишним тредов и процессов, можно на этом примере изучить тему «asynchronous I/O в Linux».

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение sabir » 18.07.2015 14:36

Таки всё-таки в отдельном треде, а не процессе. Вот если заюзать fork() — то будет в отдельном процессе.

С чисто юридической точки зрения, таки да в отдельном треде/нити, ну а ежели по простому, по рабоче-крестьянски, то на этом форуме едва ли найдется пара-тройка людей, которые действительно понимают и смогут доходчиво объяснить другим, чем тред отличается от процесса, я имею ввиду на ядерном уровне, я например не понимаю.

Читайте также:  Process information linux command

Кстати, задавшись вопросом, можно ли сделать по-номальному, без лишним тредов и процессов, можно на этом примере изучить тему «asynchronous I/O в Linux»

Ну почему же нельзя, можно и в главном цикле обрабатывать, без clone() и fork() -ов всяких, но тогда теряется быстрая реакция на событие, т.е. если главный цикл большой и выполняется относительно долгое время или ожидает ввода/вывода, а реакция на нажатие кнопки нужна прямо сейчас, то форкнуть обработчик в отдельный процесс, на мой личный взгляд, совсем не лишнее. Впрочем, как и весь кодинг, все зависит от кодера и его убеждений.

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение yoshakar » 18.07.2015 16:29

Зачем же на ядерном? Можно и попроще для начала: у тредов память общая, а у процесов — нет. То есть чтобы передать данные из одного треда в другой (например, передать код нажатой клавши в цикл, делающий «страшно важную работу») достаточно объявить статическую переменную. А из процесса в процесс — придётся устраивать специальный канал общения. Есть и ещё разница, но это самое главное.

Ну почему же нельзя, можно и в главном цикле обрабатывать, без clone() и fork() -ов всяких, но тогда теряется быстрая реакция на событие

Да, и так можно, но я говорил именно об асинхронном вводе-выводе, то есть и без тредов/процессов и без задержек обработки.

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение v4567 » 19.07.2015 19:36

Всем огромное спасибо за помощь.
А особенно спасибо Bizdelnick и sabir !!

Да, и так можно, но я говорил именно об асинхронном вводе-выводе, то есть и без тредов/процессов и без задержек обработки.

Может получиться, но надо выискивать где в программе во время выполнения вставлять обработчик нажатия клавиш — но это не правильно. Может получиться так что клавиша будет нажата когда выполняется не обработчик нажатия клавиш и тогда получится так что программа не выполнит то что должна выполнить после нажатия определённой клавиши.

На ассемблере это реализуется очень просто при помощи обработки прерываний. Кусок кода который должен обрабатывать прерывание от клавиатуры просто загрузился в озу и не выполняется, а выполняться начнёт когда сработает прерывание от клавиатуры.

Подскажите пожалуйста ещё вот что.

Как программно реализовать (в linux) переключение в буквенно-цифровой (25×80) режим из графики и обратно, если сценарии инициализации системы — SysV init scripts, а в inittab прописан только один терминал, в котором грузится графика и по Ctrl+Alt+F* в другие терминалы не переключиться.

Bizdelnick Модератор Сообщения: 20387 Статус: nulla salus bello ОС: Debian GNU/Linux

Re: как на Си реализовать обработчик нажатия клавиш

Сообщение Bizdelnick » 19.07.2015 21:02

Кусок кода который должен обрабатывать прерывание от клавиатуры просто загрузился в озу и не выполняется, а выполняться начнёт когда сработает прерывание от клавиатуры.

Ну так Вы ж не в DOS’е вроде бы работаете. В нормальных системах прерывания обрабатывает ядро, а не прикладные программы.

Как программно реализовать (в linux) переключение в буквенно-цифровой (25×80) режим из графики и обратно, если сценарии инициализации системы — SysV init scripts, а в inittab прописан только один терминал, в котором грузится графика и по Ctrl+Alt+F* в другие терминалы не переключиться.

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Источник

Оцените статью
Adblock
detector