![](/img/trans.png)
[英]What parameters for setvbuf perform the same action as setbuf(stdin, NULL) did?
[英]Effect of setvbuf function with null parameters
在 C 程序的最开始,我遇到了以下行:
setvbuf(stdout, NULL, _IONBF, 0);
因为我不知道这个setvbuf
function,所以我在这里查看了它的文档。 但是,在这一行之后,在参数/模式部分:
_IONBF无缓冲:不使用缓冲。 每个 I/O 操作都尽可能快地写入。 在这种情况下,缓冲区和大小参数将被忽略。
我仍然感到困惑。 如果这种模式使一半的参数被忽略,那么这一行究竟给程序带来了什么?
setvbuf(stdout, NULL, _IONBF, 0);
要求 stream 不使用任何缓冲。 具体来说,在第三个参数中, _IONBF
请求不进行缓冲。 对于缓冲的 stream,此调用请求更改以使其无缓冲。
由于没有缓冲区,stream 不需要缓冲区(在第二个参数中传递)或缓冲区的长度(在第四个参数中传递)。
如果第三个参数是_IOLBF
或_IOFBF
,则调用请求缓冲(分别为行缓冲或全缓冲),然后使用第二个和第四个参数。 (它们可能仍然是NULL
和 0 以请求setvbuf
分配 memory,或者它们可能具有其他值以提供由调用者安排的缓冲区。)
我仍然感到困惑。 如果这种模式使一半的参数被忽略,那么这一行究竟给程序带来了什么?
缓冲 I/O 操作首先将数据放入缓冲区,然后当满足某些条件时(例如特殊情况数据 - 如标准输出'\n'
,缓冲区大小达到特定阈值,调用特殊 function(缓冲区刷新)等)正在发送缓冲区中的数据。
如果禁用缓冲区,则数据不会放入缓冲区,只能直接发送。 在许多情况下它非常方便,例如当多个线程发送数据并且只使用一个缓冲区时,您可能会从两者中获得混合数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.