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的通常行为。通常,你不会从标准输入读取你写入标准输出的内容(这里也不是这样,它只是看起来相似!)
我无法理解 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的通常行为。通常,你不会从标准输入读取你写入标准输出的内容(这里也不是这样,它只是看起来相似!)