标准输出引起的重定向文件失败问题

由于输出很少,程序又不是正常结束(通过ctrl+c结束), 导致标准输出重定向到文件的内容为空

原因在于标准输出的缓冲模式

标准输出(stdout)的缓冲原理
缓冲类型分为三种:

  • 无缓冲
  • 行缓冲
  • 全缓冲

stderr默认缓冲就是无缓冲。而stdout的缓冲类型与输出介质有关:

屏幕或者终端:行缓冲
重定向文件、管道:全缓冲

为什么和输出介质有关,这很可能是shell重定向时候dup2的设置

解决方法一
显示调用fflush
这种方法的缺点有两个:效率、使用不方便。 (因为你可能需要重新设置信号处理函数来处理ctrl+c, 或者kill -9 这种情况根本无法解决)

解决方法二
c函数setvbuf
https://www.runoob.com/cprogramming/c-function-setvbuf.html

int setvbuf(FILE *stream, char *buf, int mode, size_t size);

setvbuf(stdout, NULL, _IOLBF, 0); //设置stdout的缓冲类型为行缓冲,

明确指定缓冲类型之后重定向就会使用该缓冲类型

Except for unbuffered files, the buf argument should point to a buffer at least size bytes long; this buffer will be used instead of the cur rent buffer. If the argument buf is NULL, only the mode is affected; a new buffer will be allocated on the next read or write operation. The setvbuf() function may be used only after opening a stream and before any other operations have been performed on it

注意这里setvbuf如果buf参数为NULL,则使用默认缓冲

另外行缓冲的语义是当遇到回车或者buffer满了之后真正输出到介质

全缓冲的语义就是buffer满了输出到介质

无缓冲就是直接输出到介质

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值