缓冲混乱

时间:2011-02-19 06:48:25

标签: c unix buffering

有人可以澄清程序使用的缓冲区类型吗?

例如:

我有一个从stdin到stdout读取的C程序。

这里涉及的缓冲区有哪些?我知道有2个。 由内核提供的用户没有任何控制权。 一个提供标准流,即stdout,stdin和stderr。每个都有一个单独的缓冲区。

我的理解是否正确?

谢谢, 约翰

2 个答案:

答案 0 :(得分:0)

如果您正在处理linux/unix,那么您可以更容易地理解有三个流

1. STDIN:文件描述符值0IN unix

2. STDOUT :文件描述符值1

3. STDERR :文件描述符值2

默认情况下,这些流对应于键盘和监视器。在unix中,我们可以更改这些流以从文件而不是键盘读取输入。使用 close(),dup()<显示文件输出而不是监视器/ strong>系统调用。是否涉及3个缓冲区。要清除c中输入缓冲区的内容,我们使用 fflush()函数。 如果您想了解有关在UNIX中处理这些流的更多信息,请告诉我。

答案 1 :(得分:0)

内核(或其他底层系统)可以有任意数量的缓冲层,具体取决于正在读取的设备和内核实现的细节;在某些系统中,该级别没有缓冲,数据直接读入用户空间缓冲区。

stdio库为stdin分配一个缓冲区;大小是依赖于实现的,但你可以控制大小,甚至可以使用setvbuf自己的缓冲区。它还允许您控制I / O是否完全缓冲(尽可能多的数据读入缓冲区),行缓冲(数据仅在遇到换行时读取)或无缓冲。如果系统可以确定输入是终端,则默认为行缓冲,否则完全缓冲。

stdout的故事类似。默认情况下,stderr是无缓冲的。