通过比较使用不同类型的setvbuf函数与不使用此函数得出的结果可以判断系统和编译器的stdout的缓冲类型(新手的猜想).
运行环境:macos Monterey 12.0.1, VScode1.63
char buf[1024];
setvbuf(stdout,buf,int,1024);
printf("a\n");
while(1);
1.注释前两行,得到结果:输出“a”
2.不注释前两行,setvbuf使用_IOFBF类型,得到结果:无输出
3.不注释前两行,setvbuf使用_IOLBF类型,得到结果:输出“a”
//4.不注释前两行,setvbuf使用_IONBF类型,得到结果:输出“a”
下列情况会引发缓冲区的刷新:
-
缓冲区满时;
-
执行fflush函数;
-
正常关闭文件。
-
正常退出程序或进程。
-
行缓冲遇到 \n刷新。
所以在程序最后加上while(1),来避免程序结束对试验结果的影响.