【问题标题】:What does enter key mean in linux terminal?在linux终端中输入键是什么意思?
【发布时间】:2017-03-28 13:10:29
【问题描述】:

我在下面有一个非常简单的 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. 为什么只有回车键使终端重复,其他键不重复?

4. 在 linux 终端或者这样的 C 程序中按 Enter 键是什么意思?

【问题讨论】:

  • 代码正在回显您键入的所有内容?有什么令人困惑的?
  • 您的应用只是复制输入。有些关于重复的问题很奇怪。
  • 请注意getchar 返回int。与EOF 相比,这实际上很重要。您的“字符”变量c 也应该是int
  • tty 处于规范模式,只是缓冲数据,直到您点击返回。当您点击返回时,它将缓冲区中的所有内容发送到您的程序。如果您将 tty 置于原始模式,它将更频繁地发送数据。
  • 除了您的 TTY 处于规范模式之外,您的标准输入流很可能处于行缓冲模式,因为当标准输入来自 TTY 时,这是 POSIX 中的默认设置。请参阅 setbuf 和/或 setvbuf 函数的描述以更改它。

标签: c linux terminal


【解决方案1】:

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

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

Tty 的行为可以改变,例如见命令stty。我鼓励您阅读“POSIX 终端”。

【讨论】:

  • "如果缓冲区已满" - 那会是多少字符/字节?它的大小是否取决于实现?它的典型尺寸是多少?
  • @CoolGuy 不记得了,但至少有几百个。
【解决方案2】:

为什么每次我按 Enter 键时,终端都会重复我刚刚输入的字符?

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

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

您键入的每个字符都会发送到程序。您的程序一次读取所有内容。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2022-01-28
    • 2012-06-30
    • 2015-05-20
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多