关于stderr stdout linux windows 平台下的差异 以及exit与_exit

  今天在看apue的时候,发现了有点忘记的函数"setbuf",man了一下是用来设置缓冲区的,设置为NULL。就会不带缓冲了。

   这个应该没什么争议好玩的就是想到了,试一试win下面的print函数发现它像是没有缓冲,执行下一个语句就直接刷新了。因为并不是基础讲解所以也不详细讲解stdout stderr做什么的了。

</pre><pre name="code" class="cpp">#include<stdio.h>
int main(void)
{
    printf("xiaochen");
    sleep(10);
   exit(0);

}
 windows下是直接输出了xiaochen 然后才休眠10秒。
 在linux下则完全不同. 先休眠等程序退出exit执行时才输出xiaochen。
 stderr则是在linux 和windows都没带缓冲。    
 接下来我们看看apue上写的ISO C 对缓冲的要求是:(p117)
1.当且仅当标准输入输出 指向交互式设备是,他们才是全缓冲的
2.标准错误绝不会是全缓冲的
3.标准错误是不带缓冲的*
4若是指向终端设备的流,则是行缓冲的;否则是全缓冲的。
总结一下
linux下面  stderr不带缓冲  stdout带行缓冲   centos6.5
windows  stderr不带缓冲 stdout给我的感觉不带   vs2010 win10环境   但是查阅msdn的文档也有一些疑惑
https://msdn.microsoft.com/en-us/library/c565h7xx.aspx                     这是*ms*dn对io流的介绍上面有说道标准输入输出是带缓冲的,但我并没有感觉到。
 Files opened using the stream routines are buffered by default. 
The stdout and stderr functions are flushed whenever they are full or, if you are writing to a character device, after each library call. If a program terminates abnormally, output buffers may not be flushed, resulting in loss of data. 
Use     fflush or _flushall to ensure that the buffer associated with a specified file or all open buffers are flushed to the operating system, which can cache data before writing it to disk. The commit-to-disk feature ensures that the  flushed buffer contents are not lost in the event of a system failure. 


 这是原文,可能是和编译器有关吧。因为这是vs2015的文档。
 
 然后说说  exit 和_exit,这两个函数。
 在linux下_exit是系统调用,而exit是一个库函数。exit会调用fflush清空缓冲流,还有把缓冲区里的东西写入磁盘内。这是和linux的回写有关系的,减少i/o次数,提升效率。
标准i/o库也是因为这个原因出现的。程序退出要注意_exit可能会让你的数据丢失。
 如果以上有错误的地方,请帮忙指出。在此感谢! 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值