【发布时间】:2016-09-06 17:38:01
【问题描述】:
我尝试对终端输出功能进行单元测试。该函数将数据流式传输到标准输出,所以我的想法是控制标准输出缓冲区并检查该函数是否正确地将正确的数据写入缓冲区。
在我看来,setvbuf 是实现这一目标的理想选择。
我使用 setvbuf 重定向标准输出以使用我自己指定的缓冲区。
我使用了流模式 _IOFBF,因此理论上只有在缓冲区已满时才会发生内部刷新。我系统上的 BUFSIZ 大小为 8192 字节......对于被测函数的输出来说已经足够大了,在调用期间没有内部刷新。
我的来源目前看起来像:
char buffer [BUFSIZ] = {0};
/* any outputs before redirecting */
printf("0\n");
/* output any remaining data */
fflush(stdout);
/* redirect to my buffer with full buffering */
setvbuf(stdout,buffer,_IOFBF,BUFSIZ);
/* testcode ... output of the function under test */
printf("1\n");
printf("2\n");
/* output any remaining data */
fflush(stdout);
/* restore internal buffering with line buffering */
setvbuf(stdout,NULL,_IOLBF,BUFSIZ);
/* let us see what is in our buffer */
printf("%s",buffer);
调试此代码显示“2\n”在测试代码部分覆盖缓冲区中的“1\n”(gcc 5.4.0 x64 GNU libc 版本:2.23)
输出是:
0
1
2
2
但我期待:
0
1
2
1
2
如有任何提示,我将不胜感激。
【问题讨论】:
-
我无法重现错误;我得到了预期的输出。
-
感谢您的验证。现在不确定这是否是我系统上 clib 缓冲区处理中的错误。你用什么编译器+版本来验证?
-
也许使用
setvbuf()太晚了? C11dr 7.21.5.6 2 “setvbuf 函数只能在 stream 指向的流与打开的文件相关联之后使用 并且在执行任何其他操作之前(对 setvbuf 的不成功调用除外)在直播中。” -
我使用的 gcc 版本 4.2.1,但可能存在未定义的行为。
标签: c redirect printf buffer stdout