什么在linux终端输入密钥意味着什么?

时间:2017-03-28 13:10:30

标签: c linux terminal

我在下面有一个非常简单的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键是什么意思?

2 个答案:

答案 0 :(得分:6)

终端输入通过称为&#34; tty&#34;的内核特定对象进行管理。此tty缓冲您在输入数据之前(默认情况下)输入的内容。这非常有用,因为它允许您(作为用户)在将命令行发送到进程之前更正它。 Tty缓冲通常处于行模式,这意味着如果缓冲区已满或输入了换行符,则会传送输入数据。

因此,当您键入单个char时,该进程无法使用该char,它位于tty缓冲区内。然后键入一个新行,两个都可供您的进程使用,然后可以读取第一个,将其推送到输出然后读取换行符并将其推送到输出。

可以更改Tty的行为,例如参见命令stty。我鼓励您阅读&#34; POSIX终端&#34;。

答案 1 :(得分:3)

  

为什么每次按下我的回车键,终端都会重复我输入的字符?

默认情况下,终端处理程序会回复您键入的所有内容。您的程序也会回复您键入的所有内容。您可以使用stty从命令行更改此行为,但是,老实说,您可能会发现它令人困惑。还有一个POSIX C API可以做同样的事情,可能会更有用。

  

为什么我放两个字符(56),这也有效,这是如何工作的?

您键入的每个字符都会被发送到该程序。你的程序一次只能读取它们。

  

为什么只有Enter键才能使终端重复,而不是其他键?

终端程序的正常模式是缓冲字符,直到收到换行符然后立即发送它们。你的程序实际上花费大部分时间在getchar()等待字符,然后当你按下新行时,会发生一系列活动,同时一次处理每个字符。