c - write() 和 read() 如何在 C 中交互()?
问题描述
我无法理解 C 中的方式read()
和write()
工作方式。我正在使用的代码似乎是STDOUT_FILENO
从STDIN_FILENO
. 我想知道这是否应该是这种情况,因为这两个文件描述符是不同的。
我已经查看了手册页,但它们似乎根本没有帮助。
这是代码:
if (write(STDOUT_FILENO, "\x1b[6n", 4) != 4) return -1;
printf("\r\n");
char c;
while (read(STDIN_FILENO, &c, 1) == 1) {
if (iscntrl(c)) {
printf("%d\r\n", c);
} else {
printf("%d ('%c')\r\n", c, c);
}
}
代码输出以语句格式化的方式写出的转义序列if
,这意味着以STDIN_FILENO
某种方式读取STDOUT_FILENO
. 这是它应该如何工作的方式,如果是这样,为什么?
解决方案
不,它完全符合您的要求:
^[[6n
是 DSR(设备状态报告)的 ansi 转义序列。这会将光标的当前位置报告给终端输入(stdin),格式为 ^[[r;cR,其中“r”和“c”分别为“行”和“列”。您可以使用它来确定终端中的光标位置。
这是终端的一个特殊功能,它可以理解和处理此类控制代码,而不是标准输入/标准输出的通常行为。通常,您不会从 stdin 读取您写入 stdout 的内容(这里也不是这种情况,它只是看起来相似!)
推荐阅读
- rust - 为什么存在对 rust 中复制类型的不可变引用?
- amazon-web-services - SQS 从队列中接收丢失的消息
- python - 如何修复 AttributeError:“Matrix”对象没有“clear”属性?
- regex - 正则表达式排除某些内容并批量重命名文件
- elasticsearch - 将数据从 logtsash 推送到 elasticserach
- uml - 我应该使用哪种类型的关系?
- javascript - 博主随机发帖显示,防止无帖子死循环
- angular - 如何解决 Angular TypeError:无法读取未定义的属性“名称”
- mysql - 使用mysql Like查询从表中检索十进制值
- python - 数据库连接错误:数据库“dbname”不存在