stdout行缓冲和stderr无缓冲的含义

本文详细解释了stdout和stderr的缓冲机制。stdout是行缓冲,只有遇到换行或缓冲区满时,内容才会被写入内核;而stderr则是无缓冲的,内容会立即写入。stdio中的缓冲类型包括全缓冲、行缓冲和无缓冲,可以通过fflush()等函数管理。默认情况下,终端输入输出流为行缓冲,stderr是无缓冲,其他文件流为全缓冲。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stdout和stderr

有人说stdio是带缓冲的,stderr是不带缓冲的,这并不是指fd=1和fd=2这两个设备文件,这两个设备是字符设备,本身没有缓存。并且你看一个进程的1和2两个fd指向的其实是同一个终端设备文件:

[root@ubuntu]arm-code:$ ls -l /proc/8669/fd/
total 0
lrwx------ 1 root root 64  4月 25 20:57 0 -> /dev/pts/7
lrwx------ 1 root root 64  4月 25 20:57 1 -> /dev/pts/7
lrwx------ 1 root root 64  4月 25 20:57 2 -> /dev/pts/7

所以,细想一下就知道,向1或2两个fd写东西,在内核里走的是完全相同的路径,不可能存在一会儿缓存一会儿不缓存的情况。

那上面说的“缓存”到底是什么东西呢?

如果你调用printf()或fwrite(…, stdout),进入标准库后会先把要写的内容放到一个缓存里,直到遇到回车(或缓存满,比如缓冲最大1024字节)或者程序退出(return和exit()会刷stdout缓存),才会调用write系统调用进到内核设备驱动实际去写。这样可以降低write系统调用的频率,而向stderr写东西就不在标准库里做缓存而是立即调用write去写了。我们说stdout是行缓冲的,stderr是无缓冲的,就是这个意思,注意这里的stdout和stderr是指标准库里的FILE结构的指针,而不是标准输出和标准错误设备

所以下面的程序,每个字符串都没有加回车,你就会看到先打印"ddddd",再一起打印"aaaaabbbbbccccc"。换成printf/perror或fprintf(stdout, …)/fprintf(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值