【问题标题】:buffer confusion缓冲区混乱
【发布时间】:2011-02-19 06:48:25
【问题描述】:

谁能澄清程序使用的缓冲区类型?

例如:

我有一个从标准输入读取到标准输出的 C 程序。

这里涉及到哪些缓冲区?我知道有2个。 由内核提供的一种,用户对其没有任何控制权。 一种提供标准流,即标准输出、标准输入和标准错误。每个都有一个单独的缓冲区。

我的理解正确吗?

谢谢, 约翰

【问题讨论】:

    标签: c unix buffering


    【解决方案1】:

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

    1.标准输入: 文件描述符值0 (IN unix)

    2.标准输出:文件描述符值1

    3.STDERR:文件描述符值2

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

    【讨论】:

    【解决方案2】:

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

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

    stdout 的情况与此类似。 stderr 默认是无缓冲的。

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2011-07-24
      相关资源
      最近更新 更多