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

在C(<;unistd.h>;)中,write()和read()如何交互?,c,io,ansi-escape,C,Io,Ansi Escape,我很难理解read()和write()如何在C中工作。我正在使用的代码似乎正在写入STDOUT\u FILENO并从stdinu FILENO读取相同的数据。我想知道是否应该是这样,因为这两个文件描述符是不同的 我已经看过手册页了,它们似乎一点帮助都没有 代码如下: if(write(STDOUT_FILENO,“\x1b[6n”,4)!=4)返回-1; printf(“\r\n”); 字符c; while(读取(标准文件号,&c,1)==1){ 如果(iscntrl(c)){ printf(“

我很难理解
read()
write()
如何在C中工作。我正在使用的代码似乎正在写入STDOUT\u FILENO并从
stdinu FILENO
读取相同的数据。我想知道是否应该是这样,因为这两个文件描述符是不同的

我已经看过手册页了,它们似乎一点帮助都没有

代码如下:

if(write(STDOUT_FILENO,“\x1b[6n”,4)!=4)返回-1;
printf(“\r\n”);
字符c;
while(读取(标准文件号,&c,1)==1){
如果(iscntrl(c)){
printf(“%d\r\n”,c);
}否则{
printf(“%d(“%c”)\r\n”,c,c);
}
}

代码以
if
station格式化的方式输出转义序列,这意味着
STDIN\u FILENO
以某种方式读取
STDOUT\u FILENO
的输出。它应该是这样工作的吗?如果是,为什么?

否,它完全按照您的要求执行:

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


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

如果它们是管道的末端,当然可以,但这段代码不足以说明。快速提问,所以“\x1b[2J”清除屏幕。这是否也会向stdin写入任何内容,或者只是每个ansi转义序列都不同?@Vasting每个转义命令都不同。只有那些询问终端信息的人才会向stdin写入响应。