[英]Strange behavior in terminal raw mode
我正在学习制作文本编辑器的教程。 到目前为止,它一直在修补原始模式。 以下代码应该关闭规范模式,并且每次按键 output。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
struct termios orig_termios;
void disableRawMode() { … }
void enableRawMode() { … }
int main() {
enableRawMode();
char c;
while (read(STDIN_FILENO, &c, 1) == 1 && c != 'q') {
if (iscntrl(c)) {
printf("%d\n", c);
} else {
printf("%d ('%c')\n", c, c);
}
}
return 0;
}
我原来忘记在printf()
语句后加上"\n"
,结果我只得到程序终止后输出的字符,即在本例中按q
后。 但是,在添加"\n"
之后,终端会在按下时输出每个字母。
任何人都可以如此友善并解释为什么它会这样吗?
原始模式是终端的关注点,但stdout
的缓冲区管理发生在到达终端之前。
默认情况下,当文件描述符1
( STDOUT_FILENO
) 链接到终端时, stdout
使用行缓冲策略。 这意味着当写入\n
时(或满时), stdout
的 output 缓冲区被刷新到文件描述符1
。 只有在这一刻,角色才能到达终端,终端可以根据其配置以不同的方式做出反应。
在您的示例中,字符仅保留在 memory 中,直到进程终止(此时刷新stdout
)。
通常,当 C 程序以连接到终端的标准 output stream 启动时,stream 是行缓冲的。 这意味着使用printf
或标准库方法打印的字符将保留在缓冲区中,直到打印\n
(结束行,因此“行缓冲”),缓冲区已满,当 stream 被手动刷新(与fflush
一样),或当在 stream 上请求输入时,它是无缓冲的或行缓冲的,但需要来自“主机环境”(尤其是人类)的字符。
终端设置无关紧要,因为字符保存在标准 C 库实现的内部缓冲区中,并且直到上述事件之一才会发送到终端。
在对stdout
执行任何其他操作之前,您可以通过调用setvbuf(stdout, NULL, _IONBF, 0)
将 stream 设置为无缓冲。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.