gpt4 book ai didi

c - 这个缓冲区是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 08:32:34 25 4
gpt4 key购买 nike

作为 Linux 系统编程练习,我编写了自己版本的树命令,它仅使用基本的 read() 和 write() C 库函数从 stdin 读取并写入 stdout。我这样做是为了在输入星号 (*) 时终止程序。我设法让它正常工作,我的问题是我真的不明白为什么它会这样工作。令我困惑的是缓冲区。首先,这里是有问题的代码部分:

char buf[1];
...
do {
read(STDIN_FILENO, buf, 1);
if( buf[0] == '*') break;
write(STDOUT_FILENO, buf, 1);
} while( buf[0] != '*');
...

我的想法是一个字符一个字符地从标准输入读取,从而将字符存储在buf中,检查它是否是星号,然后将字符从buf写入标准输出。

行为如下:我键入任意数量的字符的字符串,按 ENTER,该字符串输出到标准输出,此时我可以键入一个新的字符字符串。如果字符串以星号结尾,则输出字符串直到星号结束,然后程序终止。

我的问题是:

1) buf 应该只包含一个字符。我怎么可能输入任意数量的字符并在按下 ENTER 时将所有字符都输出到标准输出?我希望一次输出一个字符,或者只输出最后一个字符。一个字符缓冲区如何存储所有这些字符?或者是否创建了许多单字符缓冲区?由谁?

2)提示字符串输出的换行符有什么特别之处?为什么它不仅仅是字符串中的另一个字符?这只是函数 read() 中的定义问题吗?

感谢您帮助理解缓冲区的工作原理!

最佳答案

这是基于 IO 调用的方式 - 读取和写入将适用于大多数操作系统。

您只读取 1 个字节,因此在您键入时,内容将由 io 缓冲区(不是您的)保存,直到您的循环读取它。由于您没有 sleep ,它会阅读,或等待阅读,速度比您人工输入的速度快。

另外,正如 R Sahu 所建议的那样——输入缓冲区可能不会呈现给您的程序,直到您在您正在输入的控制台上按下回车键。这取决于控制台及其配置——但大多数都会缓冲行并等待输入。如果您通过管道输入标准输入,情况会有所不同。

要读取的最后一个参数“1”指示它在此处读取一个字节。

第二部分是您的输出也被缓冲,控制台输出缓冲区通常使用换行符来刷新和显示该行。在此之前,您的代码会将其写入该输出缓冲区。如果您不想要这种行为,那么在写入之后调用 fflush 应该逐个字符地输出。

关于c - 这个缓冲区是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27662855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com