Как нажать последнюю клавишу, не останавливая программу C?

Написание приложения с интерфейсом командной строки, и я хотел бы в любое время знать, нажата ли F1, ESC или клавиша со стрелкой. Каков самый простой способ сделать это? Я хотел бы избежать использования библиотеки типов readline.

Это конкретный вопрос Linux; программа не многопоточная.


person Alex Xander    schedule 03.10.2009    source источник
comment
Это зависит от платформы — какие платформы вы хотите поддерживать?   -  person Pete Kirkham    schedule 03.10.2009


Ответы (3)


Реализация kbhit() для Linux представлена ​​в Начало программирования под Linux. стр. 167. Вы можете прочитать его в Интернете по указанной ссылке.

РЕДАКТИРОВАТЬ: я упоминаю kbhit(), потому что он был опубликован как решение до того, как стало ясно, что вопрос связан с Linux. К сожалению, решение было удалено, что очень жаль. Принцип заключается в том, что когда kbhit() возвращает ненулевое значение, последующий блокирующий вызов символьно-ориентированного чтения не блокируется. Это верно только для символьного ввода; getchar() и другие стандартные функции, читающие stdio, обычно ориентированы на строку, поэтому блокируются до перехода на новую строку.

person Clifford    schedule 03.10.2009
comment
Тогда вы неправильно понимаете код! kbhit() id не блокирует и просматривает буфер, чтобы увидеть, есть ли доступный символ, когда он возвращает ненулевое значение, последующее блокирующее чтение гарантирует не блокировку. К сожалению, сообщение, показывающее, как используется kbhit() (и на которое я ссылался), было удалено, предположительно потому, что оно не предназначалось для Linux. ИМО, его следует восстановить, он все еще актуален. - person Clifford; 03.10.2009

В стандарте C нет способа сделать это, но реализации C в различных операционных системах обычно имеют некоторые расширения для этого.

В Windows вы можете использовать getch(). В Linux и Unix посмотрите на этот вопрос:

Неблокирующий getch(), ncurses

Кроме того, это самый первый вопрос в разделе «Системные зависимости» в списке часто задаваемых вопросов C:

19.1

person Thomas Padron-McCarthy    schedule 03.10.2009
comment
Я не думаю, что это правильно. Я полагаю, вы всегда можете сделать это, написав свои собственные обработчики прерываний. - person Alex Xander; 03.10.2009
comment
Алекс: В стандарте C нет способа заставить нажатие клавиши начать отправку сигналов, поэтому вы не можете написать обработчик сигнала для этого. Возможно, вы думаете о том, как это сделать в какой-то конкретной операционной системе, например Windows? Но, как я уже сказал, в стандарте C об этом ничего не сказано. - person Thomas Padron-McCarthy; 03.10.2009
comment
@Alex Xander: Похоже, вы пишете программу уровня приложения, а не драйвер устройства, поэтому обработчики прерываний обычно недоступны в качестве опции. - person Greg Hewgill; 03.10.2009

Несколько потоков?

person Vlad Gudim    schedule 03.10.2009
comment
Если вы просто хотите проверить, нажата ли клавиша, дополнительный поток будет излишним и излишне усложнит ситуацию. - person Thomas Padron-McCarthy; 03.10.2009