Linux缓冲区

    所有的磁盘I/O都要进过内核的快缓冲区(内核缓冲区高速缓冲),既然read和write都要被内核缓冲,那么“不带缓冲的IO”指的是在用户的进程中对这两个函数不会进行缓冲,每次read和write都要进行一次系统调用。。
    标准IO库提供缓冲的目的是尽可能的减少调用read和write的次数。
flush:冲洗,说明标准缓冲区的写操作。缓冲区可以调用fflush冲洗,也可由标准IO例程自动清洗。在unix环境中,flush有两重意思:(1)标准IO库方面:flush的意思时把缓冲区中的内容写到磁盘上(该缓冲区可能时局部填写),在终端方面:表示丢弃一存储在缓冲区中的数据。
标准缓冲库提供了三种类型的缓冲:
1、全缓冲:这种情况下只有填满了缓冲区才进行实际的IO操作,对于驻留在磁盘上的文件一般实施的是全缓冲。在一个流执行第一次的IO操作时,相关标准IO函数通常调用malloc获得所需的缓冲区。当且仅当标准输入输出不涉及交互式设备时才是全缓冲。
2、行缓冲:这时当输入和输出中遇到换行符,标准IO执行IO操作。
3、不带缓冲:标准错误流时不带缓冲的。

测试结果:

如上图所示:
    write函数是不带缓冲的。因为在fork之前调 w用write,所以其数据写到标准输出一次,但是标准io库是带缓冲的。如果标准输出到终端,则他是行缓冲的,否则它是全缓冲的。当程序以交互式运行时,printf只输出一次,其原因时标准输出缓冲区被换行符冲洗。但当输出到文件时,printf却输出两次。原因是:fork之前调用了一次printf,但当调用fork时,befor fork!该行数据还在缓冲区中,然后将父进程的数据空间复制进子进程中,于是父子进程都有了带该行内容的标准IO缓冲区。在每个进程结束后,最终会冲洗缓冲区副本。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值