write() 和 read() 如何在 C (<unistd.h>) 中交互?

How do write() and read() interact in C (<unistd.h>)?

我无法理解 read()write() 在 C 中的工作方式。我正在使用的代码似乎正在写入 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" 为 "row" 和 "column"。您可以使用它来确定光标在终端中的位置。

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