关于标准输入输出的缓存

APUE上说当标准输入标准输出的对象时终端时,行缓存。但是对于下面代码:

printf("%% ");
fgets(buf, MAXLINE, stdin);

第一行执行完,马上就输出%提示符了。那个习题问为什么。我试验了下还真是那么回事,为什么呢?我想了会,不得其解。不过隐约觉得应该和行缓存的那两个限制有关。APUE上说了对行缓存的两个限制。第一个好理解,只要填满缓存,即使没有一个换行符,也进行刷新操作。第二:”任何时候只要通过标准输入输出库要求从 ( a )一个不带缓存的流,或者 ( b )一个行缓存的流(它预先要求从内核得到数据)得到输入数据,那么就会造成刷新所有行缓存输出流。在 ( b )中带了一个在括号中的说明的理由是,所需的数据可能已在该缓存中,它并不要求内核在需要该数据时才进行该操作。很明显,从不带缓存的一个流中进行输入( ( a )项)要求当时从内核得到数据。“


说实话,第二个限制看的我晕头转向。google了下也没人说个所以然。不过还好,找到了英文原文:

Second, whenever input is requested through the standard I/O library from either (a) an unbuffered stream or (b) a line-buffered stream (that requires data to be requested from the kernel), all line-buffered output streams are flushed. The reason for the qualifier on (b) is that the requested data may already be in the buffer, which doesn't require data to be read from the kernel. Obviously, any input from an unbuffered stream, item (a), requires data to be obtained from the kernel.

终于搞明白第二个限制说的是啥,意思是说,当有个标准库函数要请求输入时,行缓存的输出流会被刷新。后面的理由还是没看明白。

下次遇到这个问题,要留心下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值