2009-10-03 1 views
1

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

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

+0

Это конкретная платформа - какую платформу вы заинтересованы в поддержке? –

+0

Я нахожусь на Linux.! –

ответ

2

Реализация kbhit() для Linux представлена ​​на странице Beginning Linux Programming, стр. 167. Вы можете прочитать ее в режиме on-line по предоставленной ссылке.

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

+0

Я видел код, но это блокирующий вызов. –

+1

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

5

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

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

Non-blocking getch(), ncurses

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

19.1

+1

Я не думаю, что это правильно. Я полагаю, вы всегда можете это сделать, написав собственные обработчики прерываний. –

+0

Во-вторых, что !!! –

+1

Alex: В стандарте C нет способа получить нажатия клавиш для начала отправки сигналов, поэтому вы не можете написать обработчик сигналов для этого. Возможно, вы думаете о том, как это сделать в какой-то конкретной операционной системе, например Windows? Но, как я уже сказал, в стандарте C ничего нет. –

1

Multiple потоки?

+0

Я собирался сказать это ... – Ben

+0

НЕТ Это не многопоточность. –

+0

Если вы просто хотите проверить, нажата ли клавиша, лишняя нить будет излишней и не будет усложнять ситуацию. –