首页 > 解决方案 > write() 和 read() 如何在 C 中交互()?

问题描述

我无法理解 C 中的方式read()write()工作方式。我正在使用的代码似乎是STDOUT_FILENOSTDIN_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. 这是它应该如何工作的方式,如果是这样,为什么?

标签: cioansi-escape

解决方案


不,它完全符合您的要求:

^[[6n是 DSR(设备状态报告)的 ansi 转义序列。这会将光标的当前位置报告给终端输入(stdin),格式为 ^[[r;cR,其中“r”和“c”分别为“行”和“列”。您可以使用它来确定终端中的光标位置。

这是终端的一个特殊功能,它可以理解和处理此类控制代码,而不是标准输入/标准输出的通常行为。通常,您不会从 stdin 读取您写入 stdout 的内容(这里也不是这种情况,它只是看起来相似!)


推荐阅读