c - 非规范和非回声模式不适用于管道
问题描述
最近,我正在尝试编写一个简单版本的 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
终端回到规范和回声模式。为什么会这样?
解决方案
一般来说,像这样more
的东西预计会从stderr
(或有时/dev/tty
但stderr
效果更好)中读取。stdin
您改为打开终端。这不太好用。
推荐阅读
- sql - 用于证明候选键约束在 R(ABCD) 中成立的 SQL 语句
- java - 使用 Ionic 4 访问 JAR 文件中的 Java API
- node.js - Angular、电子、打字稿和机器人
- javascript - 为什么 Node.js 不能处理来自 Vue.js 的请求?
- haskell - 如何避免编写琐碎的数据类型检查函数
- c# - 在 C# 中使用带有数据库的组合框选择索引值
- javascript - 当单选按钮选中时 div 隐藏/显示文本字段有效但未插入数据库
- angular - 如何修复 ionic 中的 getToken() 错误?
- javascript - return 语句在 javascript try 块中不起作用
- reactjs - Reactjs 通过来自另一个组件的 onclick 更改 div 中的内容