【发布时间】:2011-02-19 06:48:25
【问题描述】:
谁能澄清程序使用的缓冲区类型?
例如:
我有一个从标准输入读取到标准输出的 C 程序。
这里涉及到哪些缓冲区?我知道有2个。 由内核提供的一种,用户对其没有任何控制权。 一种提供标准流,即标准输出、标准输入和标准错误。每个都有一个单独的缓冲区。
我的理解正确吗?
谢谢, 约翰
【问题讨论】:
谁能澄清程序使用的缓冲区类型?
例如:
我有一个从标准输入读取到标准输出的 C 程序。
这里涉及到哪些缓冲区?我知道有2个。 由内核提供的一种,用户对其没有任何控制权。 一种提供标准流,即标准输出、标准输入和标准错误。每个都有一个单独的缓冲区。
我的理解正确吗?
谢谢, 约翰
【问题讨论】:
如果您正在处理linux/unix,那么您可以更容易地理解共有三个流
1.标准输入: 文件描述符值0 (IN unix)
2.标准输出:文件描述符值1
3.STDERR:文件描述符值2
默认情况下,这些流对应于键盘和监视器。在 unix 中,我们可以将这些流更改为从文件而不是键盘读取输入。使用 close(),dup() 系统调用。是的,涉及 3 个缓冲区。要清除 c 中输入缓冲区的内容,我们使用 fflush() 函数。 如果您想了解更多关于在 UNIX 中处理这些流的信息,请告诉我。
【讨论】:
内核(或其他底层系统)可以有任意数量的缓冲层,这取决于正在读取的设备以及内核实现的细节;在某些系统中,该级别没有缓冲,数据直接读入用户空间缓冲区。
stdio 库为 stdin 分配一个缓冲区;大小取决于实现,但您可以控制大小,甚至可以将自己的缓冲区与 setvbuf 一起使用。它还允许您控制 I/O 是完全缓冲(将尽可能多的数据读入缓冲区)、行缓冲(数据仅在遇到换行符之前读取)或无缓冲。如果系统可以确定输入是终端,则默认为行缓冲,否则为完全缓冲。
stdout 的情况与此类似。 stderr 默认是无缓冲的。
【讨论】: