Как непосредственно считать ввод с клавиатуры в режиме реального времени?

Еще одна идея: можно использовать нормальный Живой CD без персистентного устройства хранения данных и использовать онлайн-сервис как http://www.delicious.com/ или http://www.google.com/bookmarks/ для отслеживания любимые страницы.

1
26.01.2013, 22:44
2 ответа

Если Вы собираетесь быть чтением из stdin, необходимо прочитать страницу справочника для tcsetattr, и конкретно раздел о ‘Каноническом и неканоническом режиме’ (ICANON). Если Вы не отключаете ICANON на stdin, вход ориентирован на строку (Вы ничего не получаете, пока Не Входят, нажимается). Это имеет место даже для O_NONBLOCK.

Если в сомнении, strace -v stty raw >&log; stty sane; grep TCSETSW logи посмотрите то, к чему это делает stdin. Можно использовать тот же системный вызов с идентичными параметрами для неприготовления терминала. Будьте осторожны, если Вы не восстановите настройки на выходе, терминал будет бесполезен после того, как Ваша программа завершается. (это - то, почему я сделал stty sane после stty raw)

Используя необработанные аппаратные средства ввод-вывод является, вероятно, очень плохой идеей, если Вы не абсолютно уверены в своих целевых аппаратных средствах, и/или Вы хотите ожидать каждый тип клавиатуры существует.

О, несмотря на него являющийся 'сырыми данными', Вы все еще читаете несколько приготовленный вход из клавиатуры: Вы не получите scancodes, Вы получите ASCII (или UTF-8, скорее всего). Таким образом, Escape десятичный 27, не 1 (как на исходной клавиатуре IBM PC).

Альтернативное предложение, которое требует доступа суперпользователя: читайте на устройствах события, откройте правильное и считайте структуры события Linux из него. Этот метод возвращает необработанные события нажатия/выпуска и ключ (они - внутренние коды клавиши ядра, тем не менее, не аппаратные средства scancodes). Выезд /usr/include/linux/input.h для специфических особенностей. Нахождение права eventX устройство для открытия в 256 байтах кода является другим вопросом в целом, конечно.

2
27.01.2020, 23:40
  • 1
    Спасибо за это! Я могу установить tty(?) на режим без предварительной обработки прежде, чем запустить программу и установить его на нормальный впоследствии, который работает вокруг проблемы. Не очень conveinient или портативный и подвергается ~20 байтам, наверху (несжатым), но определенно лучше, чем я думал прежде! Кажется, что с помощью ioctl + TCSETSW требует хранения termios структуры, которая составляет 57 байтов, который, очевидно, является очень costy для меня в этом случае. Я должен экспериментировать с этим немного, но до сих пор я нашел "достаточно хорошее" решение для своих потребностей. Еще раз спасибо, сохраненный мой день. :) –  zxcdw 24.01.2012, 04:45
  • 2
    пожалуйста! В зависимости от правил Вы могли также сделать систему ("stty сырые данные"), который является немного более компактен мудрый кодом (но более дорогостоящий мудрый вычислением), чем выполнение termios манипуляции. –  Alexios 24.01.2012, 04:53

Необходимо установить tty на режим без предварительной обработки, видеть man stty.

0
27.01.2020, 23:40

Теги

Похожие вопросы