当我键入任何键时,通常会立即回显到std输出,即我的屏幕。
如果我必须输入密码,表示它不会回显,我看不到我输入的密钥。
这是如何运作的。
每个按键是否立即进入内核(没有按下ENTER键),然后内核决定是否回显它们? 就像,我按'A',它进入内核;内核回应它;我在屏幕上看到它。现在我再次点击'B'...同样的序列...;现在我的屏幕上有'AB'(我的命令)然后点击ENTER;我的命令进入内核并最终执行。
还有其他解释吗?在按键期间后台会发生什么?
答案 0 :(得分:5)
内核中的终端驱动程序可以放在几种模式中(实际上有更多的标志,而这些天“cbreak”实际上与另一个标志相反,所以这简化了。)
“cbreak”模式意味着尝试从终端读取的进程将在可用时立即接收键盘输入。当cbreak模式关闭时,内核将数据存储在缓冲区中,直到输入被按下,并且某些键(如退格键)由内核处理(当您按退格键时,它会从缓冲区中删除字符,并且 - 如果回显模式为on - 将“backspace-space-backspace”写入终端以用空格覆盖该字符。)
回声模式意味着每当用户按下某个键时,内核会立即将其回显给屏幕。当它关闭时,屏幕上不会回显任何内容,如果希望您看到它,程序将需要将其写入终端。
有几种典型情况:
^[[D
等转义序列。正在运行的程序告诉内核使用termios
函数将其置于何种模式。您可以使用stty
命令在shell环境中执行相同的操作,但请注意,这可能会干扰shell自己的输入处理或您运行的程序预期默认状态。
答案 1 :(得分:1)
您的键盘会生成电子信号,最终会被解释为与字母对应的键码 - “A”,“B”,功能键F1,F2等。这一切都发生在内核处理的键盘驱动程序中。该键盘驱动程序有一个缓冲区,用于从键盘接收所有按键并将其发送到内核,然后内核将其引导到当前具有焦点的进程。如何处理键序列完全取决于各个应用程序,例如是否显示键。
答案 2 :(得分:-1)
echo
计划是coreutils
的一部分。您可以下载其来源here。看src/echo.c
它很小。您可以看到echo
使用fputc
或putchar
来电。这些调用处理名为stdout
的标准流。标准流的体系结构非常复杂,超出了这篇文章的范围。您可以使用例如google
找到它。