繁体   English   中英

终端原始模式下的奇怪行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM