linux中的tty如何获取输入并传递到程序中以及如何获取它?

问题描述

比方说,我有一个具有以下循环的C程序。

while ((c = getchar()) != EOF) {
    ...
}

此循环似乎是在tty上键入字符时一个一个地读取它们。但是,一旦输入了字符,我就不能更改它们,显然,这不会发生。
这必须意味着tty必须保留一些缓冲区以保留它已接收但尚未推送到stdin的值。一旦进入标准输入,就会一一读取字符。

这是正确的吗?如果是这样,我如何才能在此缓冲区中获取字符,而不必去标准输入?我尝试将ioctl与FIONREAD一起使用,但似乎不起作用(即使终端中有字符,缓冲区的大小也始终为零),并且由于此数据不在stdin中,因此这意味着可以从stdin中读取数据不起作用(这些是对类似问题的解答)

解决方法

简短答案:

termios.h是POSIX标准的头文件,可以让tty进入原始模式,而通常处于煮熟模式

建议阅读其文档/手册页。

一个通过termios.h设置原始模式的分步网页被链接到here

说明:

默认情况下,终端的I / O是行缓冲的,即,确保在行终止时刷新输入/将其发送到您的程序。

在输出中,这是通过\nfflush(stdout);进行的,而在输入中,这是通过用户按下[ENTER]的键来实现的。

使终端进入 raw 模式,这样一来,只要按下一个键,输入信号就会发送到您的程序中,同时还会提供许多其他默认功能,例如回显禁用。

这对于任何稍微复杂的CLI程序都是很常见的,尤其是像vim,htop等之类的东西。