c语言stdout,stdin,stderr缓冲问题

问题背景

这个c语言中,对于输入输出流的缓冲问题我是早就知道的。但是以前对输入流关注的较多,没想到今天因为输出流,害的师兄们找了一天,我也帮忙找了一下午才找出来。


问题来源

师兄有个C语言程序,程序前面输出一堆东西(绝对没有错),后面很复杂,调试时出现了段错误(segment error)。

如果直接运行这个程序输出会显示出来,然后出现段错误。 但是一旦要重定向到一个文件里面,前面的输出就奇迹般地消失了 。

各种方法调试,包括在程序中输出到文件中,结果却发现可以,也就是说程序可以运行,但是前面的输出就是显示不出来。


(中间还有很多奇怪的地方,最后我们解决问题后回过来一看,原来是人家把输出放到了stderr上了)

解决前兆

富哥一直说既然printf在前面那就会先打出来。在我们没有用文件测试时,我也是这样认为的,但是现在富哥的这句话,让我不由地写了一个测试程序:

printf("-----111-----\n");
for(int i=0;i<100*10;i++) for(int j=0;j<100*10;j++) for(int n=0;n<100*10;n++);
printf("-----222-----");

这个程序要运行大约3秒钟。你会发现执行这个程序后,屏幕一片黑暗,然后突然两行同时出现。也就是说输出被缓存了。 ( 测试在ubuntu上进行,后来在windows上进行测试,该问题不会发生


解决

果然,最后我们修改程序,把printf换成 fprintf(strerr,"----");可以了,然后又试了还是printf,但是写上fflush(stdout); 也可以了。 看来就是缓存的原因了,core dump 把缓存给清空了,所以最终什么也看不到。


总结

stderr 无缓存直接输出。 stdin,stdout 都有缓存,对于stdin 应该经常遇到,如果多输入,则会给下次输入带来影响。stdout今天头一次遇到,我写出那个测试程序,以前也真的没想到这里。 c/c++ 果然是硬件类型的语言,不懂计算机原理,在错误的排除上会遇到困难。





  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值