使用setvbuf更改printf的默认buffer 行为

    有3种buffer行为,“不缓冲”,“基于块的缓冲”和“基于行的缓冲”。stdout(printf)默认是基于行的缓冲,即写到stdout的字符都会被缓冲起来直到一个换行符输出的时候,这些字符才会被打印出来;标准错误输出stderr默认是不缓冲的,即写到stderr的字符会马上被打印出来。

    下面的例子每隔1S,用printf输出一个“Hello World!”字符串:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    while (1) {
        printf("Hello World!");
        sleep(1);
    }
    return 0;
}

实际运行的结果是很长一段时间内BUFSIZ没有被填满前,没有任何输出。前面提到stdout(printf)是“基于行的缓冲”,我们在“Hello World!”后加一个换行“\n”试试。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    while (1) {
        printf("Hello World!\n");
        sleep(1);
    }
    return 0;
}

运行结果是每隔1S有一个“Hello World!”和换行输出,如下:

Hello World!
Hello World!
Hello World!
Hello World!

    下面尝试通过int setvbuf(FILE *stream, char *buf, int mode, size_t size); 更改stdout的默认缓冲行为,将line buffered修改为unbuffered。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    setvbuf(stdout, NULL, _IONBF, 0);
    while (1) {
        printf("Hello World!");
        sleep(1);
    }
    return 0;
}

运行结果是每隔1S有一个“Hello World!”输出,如下:

Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!

    基于stdout和stderr的缓冲行为,如果我们在调试问题打印输出的时候想马上看到输出结果,可以将stdout的line buffered修改为unbuffered,或者使用fprintf(stderr, ...)。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值