缓冲

来源:互联网 发布:菜鸟也会数据分析pdf 编辑:程序博客网 时间:2024/04/29 02:26

1.setbuf和setvbuf

1.1 setbuf改变stdout的行为    

标准输出通常是行缓冲的,也就是遇到\n或者缓冲区满时才执行IO:

     

#include <unistd.h>#include <stdio.h>int main(){//setbuf(stdout,NULL);printf("ASD");sleep(1);printf("__\n");return 0;}
执行的时候,会等待一秒,然后输出ASD__,而不是先输出ASD,再等待一秒,再输出__。


可以用setbuf(stdout,NULL)设置为无缓冲:

#include <unistd.h>#include <stdio.h>int main(){setbuf(stdout,NULL);printf("ASD");sleep(1);printf("__\n");return 0;}
这时就会先输出ASD,等待一秒,再输出剩下的。

设置为全缓冲:

#include <unistd.h>#include <stdio.h>char buf[256];int main(){setbuf(stdout,buf);printf("ASD\n");sleep(1);printf("__\n");return 0;}

尽管第一个printf是有\n的,但是会等待一秒,最后全部一起输出。

或者使用setvbuf设置为全缓冲:

#include <unistd.h>#include <stdio.h>char buf[256];int main(){setvbuf(stdout, buf, _IOFBF, 256);//setvbuf(stdout,NULL, _IOFBF, 0);puts("ASD");sleep(1);puts("__");return 0;}

用setvbuf设置无缓冲:

#include <unistd.h>#include <stdio.h>char buf[256];int main(){setvbuf(stdout,NULL, _IONBF, 0);printf("a");sleep(1);puts("ASD");sleep(1);puts("__");return 0;}

设置长度为2的行缓冲:

#include <unistd.h>#include <stdio.h>char buf[256];int main(){setvbuf(stdout,NULL, _IOLBF, 2);printf("a");sleep(1);printf("AS");sleep(1);printf("__");return 0;}


原创粉丝点击