Как на самом деле работает эхо в Unix - PullRequest
3 голосов
/ 12 декабря 2011

Когда я набираю любую клавишу, обычно она немедленно возвращается на стандартный вывод, то есть экран my.my.

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

Как это работает.

При каждом нажатии клавиши происходит немедленное переключение в ядро ​​(без нажатия клавиши ВВОД), а затем ядро ​​решает повторить их или нет? Мол, я нажимаю «А», это идет к ядру; ядро повторяет это; Я получаю это на моем экране. Теперь я нажимаю "B" ... та же самая последовательность снова ...; Теперь у меня есть «AB» на моем экране (моя команда) и нажимаю ENTER; Моя команда отправляется в ядро ​​и, наконец, выполняется.

Есть ли другие объяснения? Что происходит в фоновом режиме при нажатии клавиш?

Ответы [ 3 ]

5 голосов
/ 12 декабря 2011

Драйвер терминала в ядре может быть установлен в нескольких режимах (на самом деле флагов гораздо больше, чем этот, и в наши дни "cbreak" фактически противоположен другому флагу, так что это упрощено).

Режим «cbreak» означает, что процесс, который пытается прочитать с терминала, получит ввод с клавиатуры, как только он станет доступен.Когда режим cbreak выключен, данные хранятся ядром в буфере до нажатия клавиши Enter, а ядром обрабатываются определенные клавиши, такие как backspace (когда вы нажимаете backspace, он удаляет символ из буфера и - если режим echoon - записывает «backspace-space-backspace» в терминал, чтобы перезаписать символ пробелом.)

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

Существует несколько типичных ситуаций:

  • В программах, которые выполняют расширенную обработку ввода (например, большинство оболочек или что-то вроде полноэкранной программы), cbreak включен, а echo выключен;программа запишет символ в сам терминал, если он не является частью escape-последовательности специального ключа.
  • В большинстве ситуаций [по умолчанию используется простая программа, которая читает stdin и пишет stdout], echo включен иCbreak выключен.Когда вы печатаете, он ведет себя так, как я описал выше, все это обрабатывается ядром до тех пор, пока вы не нажмете Enter и не отправит его в приложение.Редактирование ввода ограничено backspace [и ctrl-u, ctrl-w], попытка использовать клавиши со стрелками просто поместит escape-последовательности, такие как ^[[D, в строку ввода.
  • При чтении пароля echoвыключен и cbreak выключен.Ввод работает так же, как и в случае по умолчанию, за исключением того, что ядро ​​не копирует ввод на экран.

Запущенная программа сообщает ядру, в каком режиме он должен работать с функциями termios.Вы можете использовать команду stty, чтобы сделать то же самое в среде оболочки, но имейте в виду, что это может повлиять на собственную обработку ввода оболочки или на то, какие программы, которые вы запускаете, ожидают состояние по умолчанию.

1 голос
/ 12 декабря 2011

Ваша клавиатура генерирует электрические сигналы, которые в конечном итоге интерпретируются как коды клавиш, соответствующие буквам - «A», «B», функциональные клавиши F1, F2 и т. Д. Все это происходит в драйвере клавиатуры, который обрабатывается ядром. Этот драйвер клавиатуры имеет буфер для приема всех нажатий клавиш с клавиатуры и отправляет их ядру, которое, в свою очередь, направляет их процессам, которые в данный момент находятся в фокусе. Что делать с последовательностью клавиш полностью решается отдельным приложением, например, отображать клавиши или нет.

0 голосов
/ 12 декабря 2011

echo программа является частью coreutils.Вы можете скачать его источники здесь .Посмотрите на src/echo.c это довольно мало.Вы можете видеть, что echo использует fputc или putchar звонки.Эти вызовы имеют дело со стандартным потоком stdout.Архитектура стандартных потоков довольно сложна и выходит за рамки этого поста.Вы можете найти его, например, google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...