【问题标题】:How does input echoing work in a Linux terminal?输入回显如何在 Linux 终端中工作?
【发布时间】:2014-06-12 13:55:32
【问题描述】:

考虑以下代码:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

void disable_echoing()
{
    termios t;
    tcgetattr(STDIN_FILENO, &t);
    t.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &t);
}

int main()
{
    sleep(1);
    printf("disabling echoing\n");
    disable_echoing();
    getchar();
}

此程序会休眠一秒钟,然后禁用输入字符的回显,然后读取输入字符。

如果我在禁用回显后键入输入字符,则不会回显该字符。到目前为止,一切顺利。

如果我在禁用回显之前键入输入字符,则会回显该字符。但此时程序正在休眠。我的问题是:如果程序正在休眠,那么回显是什么

我问这个问题的动机是 Windows 上的一个类似程序(显然禁用回显的具体机制不同)表现不同:即使我在程序休眠时键入输入字符,也不会发生回显,然后当程序从睡眠中唤醒它会在运行执行回显的代码之前禁用回显 (getchar()),因此仍然不会发生回显。

【问题讨论】:

  • 可能是你的终端程序...
  • @MarcusRickert 但是当连接到远程计算机时,如果连接速度很慢,输入通常会回显缓慢......
  • 回声似乎有很多不同的处理方式。也许en.wikipedia.org/wiki/Echo_%28computing%29 可以对此有所了解。

标签: c linux input terminal


【解决方案1】:

我的问题是:如果程序正在休眠,那么回显是什么?

The kernel's tty layer.

通过 tty 的输入和输出——无论是串行端口、虚拟控制台还是 pty——都由内核根据该 tty 的当前配置进行处理。这个处理过程非常复杂,并且可以包括以下所有功能:

  • 输入输出队列和处理流控制
  • 波特率和奇偶校验处理(用于串行线路)
  • 跟踪终端的大小,以行和列为单位
  • 行缓冲和编辑
  • 将输入回显到输出
  • 字符转换:
    • 将输出换行符转换为 CR + NL 序列
    • 将输入退格转换为 DEL 字符
    • 制表符到空格的转换(默认关闭)
    • 将退格字符转换为交替序列,例如abc^H^H^H to abc\cba/(默认关闭,用于不能擦除字符的硬拷贝终端)
  • 解释各种类型的输入控制序列:
    • 有些向前台进程发送信号,例如 ^C^Z
    • 有些会触发内核中的基本行编辑,例如 ^H 用于退格,^W 用于 kill-word,以及 ^U杀线。
    • 有些与流控制交互,例如 ^S^Q

简而言之,内核的 tty 层正在完成很多工作!它不仅仅是将输入传递给输出。

Windows 没有与 UNIX 系统相同的 tty 层。它确实有一个控制台,但它的工作方式非常不同——我的理解是,它主要是为了模拟 PC BIOS 的文本模式,而不是终端。

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2017-12-15
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多