setvbuf 的大小参数对于无缓冲流意味着什么?
What does the size argument of setvbuf mean for an unbuffered stream?
函数setvbuf()
可用于使流无缓冲:
#include <stdio.h>
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
当 mode
作为 _IONBF
传递时,size
参数的值意味着什么?
会分配缓冲区吗?
可以通过0
吗?
C 标准的当前版本 (C11) 说:
7.21.5.6 The setvbuf
function
Synopsis
#include <stdio.h>
int setvbuf(FILE * restrict stream,
char * restrict buf,
int mode, size_t size);
Description
The setvbuf
function may be used only after the stream pointed to by stream
has been associated with an open file and before any other operation (other than an unsuccessful call to setvbuf
) is performed on the stream. The argument mode
determines how stream will be buffered, as follows: _IOFBF
causes input/output to be fully buffered; _IOLBF
causes input/output to be line buffered; _IONBF
causes input/output to be unbuffered. If buf
is not a null pointer, the array it points to may be used instead of a buffer allocated by the setvbuf
function273) and the argument size
specifies the size of the array; otherwise, size
may determine the size of a buffer allocated by the setvbuf
function. The contents of the array at any time are indeterminate.
Returns
The setvbuf
function returns zero on success, or nonzero if an invalid value is given for mode
or if the request cannot be honored.
条件时态的使用为库作者在如何实现 setvbuf()
.
方面提供了很大的灵活性
Steve Summit 这样争论:
如果 mode
作为 _IONBF
传递,显然 size
应该被忽略,并且显然 0
是传递的适当值。 (也就是说,如果你传递了 0 以外的任何数字,它仍然会被忽略,并且不会分配任何东西,但这个调用看起来会非常误导。)但是我刚刚看过的两个不同的手册页没有出来并明确地说出来。
C 标准确实允许在所有情况下忽略 size
,并且在无缓冲情况下忽略它确实有意义。
我找到了一个也有意义的替代方案:setvbuf()
仍然可以指定流输出函数使用的缓冲区,静态的或分配的,只要流函数不保留任何未刷新的输出当他们 return 时。例如,printf
可以使用此缓冲区来组合其输出并按块刷新它。 C 标准 未 指定无缓冲流对写入输出流系统句柄的每个字节使用系统调用。这些是超出标准范围的实施细节。
如果 setvbuf()
确实尝试分配 size
字节但失败了,它可能 return 一个非零值并且不会使流无缓冲。仍然符合要求的意外行为。尝试 setvbuf(stdout, NULL, _IOFBF, SIZE_MAX);
函数setvbuf()
可用于使流无缓冲:
#include <stdio.h>
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
当
mode
作为_IONBF
传递时,size
参数的值意味着什么?会分配缓冲区吗?
可以通过
0
吗?
C 标准的当前版本 (C11) 说:
7.21.5.6 The
setvbuf
functionSynopsis
#include <stdio.h> int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size);
Description
The
setvbuf
function may be used only after the stream pointed to bystream
has been associated with an open file and before any other operation (other than an unsuccessful call tosetvbuf
) is performed on the stream. The argumentmode
determines how stream will be buffered, as follows:_IOFBF
causes input/output to be fully buffered;_IOLBF
causes input/output to be line buffered;_IONBF
causes input/output to be unbuffered. Ifbuf
is not a null pointer, the array it points to may be used instead of a buffer allocated by thesetvbuf
function273) and the argumentsize
specifies the size of the array; otherwise,size
may determine the size of a buffer allocated by thesetvbuf
function. The contents of the array at any time are indeterminate.Returns
The
setvbuf
function returns zero on success, or nonzero if an invalid value is given formode
or if the request cannot be honored.
条件时态的使用为库作者在如何实现 setvbuf()
.
Steve Summit 这样争论:
如果 mode
作为 _IONBF
传递,显然 size
应该被忽略,并且显然 0
是传递的适当值。 (也就是说,如果你传递了 0 以外的任何数字,它仍然会被忽略,并且不会分配任何东西,但这个调用看起来会非常误导。)但是我刚刚看过的两个不同的手册页没有出来并明确地说出来。
C 标准确实允许在所有情况下忽略 size
,并且在无缓冲情况下忽略它确实有意义。
我找到了一个也有意义的替代方案:setvbuf()
仍然可以指定流输出函数使用的缓冲区,静态的或分配的,只要流函数不保留任何未刷新的输出当他们 return 时。例如,printf
可以使用此缓冲区来组合其输出并按块刷新它。 C 标准 未 指定无缓冲流对写入输出流系统句柄的每个字节使用系统调用。这些是超出标准范围的实施细节。
如果 setvbuf()
确实尝试分配 size
字节但失败了,它可能 return 一个非零值并且不会使流无缓冲。仍然符合要求的意外行为。尝试 setvbuf(stdout, NULL, _IOFBF, SIZE_MAX);