我在下面有一个非常简单的C函数:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
return EXIT_SUCCESS;
}
我在linux os终端上使用gcc来测试它。
结果是:
d
d
e
e
f
f
5
5
56
56
我只是想知道:
1.为什么每次按下我的回车键,终端都会重复我输入的字符?
2.为什么我放两个字符(56),这也有效,它是如何工作的?
3.为什么只有Enter键使终端重复,而不是其他键?
4.在Linux终端或像这样的C程序中按Enter键是什么意思?
答案 0 :(得分:6)
终端输入通过称为&#34; tty&#34;的内核特定对象进行管理。此tty缓冲您在输入数据之前(默认情况下)输入的内容。这非常有用,因为它允许您(作为用户)在将命令行发送到进程之前更正它。 Tty缓冲通常处于行模式,这意味着如果缓冲区已满或输入了换行符,则会传送输入数据。
因此,当您键入单个char时,该进程无法使用该char,它位于tty缓冲区内。然后键入一个新行,两个都可供您的进程使用,然后可以读取第一个,将其推送到输出然后读取换行符并将其推送到输出。
可以更改Tty的行为,例如参见命令stty
。我鼓励您阅读&#34; POSIX终端&#34;。
答案 1 :(得分:3)
为什么每次按下我的回车键,终端都会重复我输入的字符?
默认情况下,终端处理程序会回复您键入的所有内容。您的程序也会回复您键入的所有内容。您可以使用stty从命令行更改此行为,但是,老实说,您可能会发现它令人困惑。还有一个POSIX C API可以做同样的事情,可能会更有用。
为什么我放两个字符(56),这也有效,这是如何工作的?
您键入的每个字符都会被发送到该程序。你的程序一次只能读取它们。
为什么只有Enter键才能使终端重复,而不是其他键?
终端程序的正常模式是缓冲字符,直到收到换行符然后立即发送它们。你的程序实际上花费大部分时间在getchar()
等待字符,然后当你按下新行时,会发生一系列活动,同时一次处理每个字符。