首页 > 解决方案 > 非规范和非回声模式不适用于管道

问题描述

最近,我正在尝试编写一个简单版本的 Linux 命令more。为此,我需要在终端中输入非规范模式和非回声模式,以便在按键后立即获得输入,并且终端不显示我输入的字符。

我是这样做的:

  // set the terminal mode
  struct termios tm;
  tcgetattr(STDIN_FILENO, &old);
  tm = old;
  tm.c_lflag &= ~(ICANON | ECHO);
  tm.c_cc[VMIN] = 1;
  tm.c_cc[VTIME] = 0;
  tcsetattr(STDIN_FILENO, TCSADRAIN, &tm);

当我使用像这样的参数时,这有效

more test_file

但是当我尝试more使用其他命令进行管道传输时

ls /bin | more

终端回到规范和回声模式。为什么会这样?

标签: clinuxterminalpipe

解决方案


一般来说,像这样more的东西预计会从stderr(或有时/dev/ttystderr效果更好)中读取。stdin您改为打开终端。这不太好用。


推荐阅读