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;
}