系统环境 Ubuntu
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ putchar('a'); write(1,"b",1); putchar('a'); write(1,"b",1); putchar('a'); write(1,"b",1); exit(0);}如上代码执行结果可选项: ababab or aaabbb or bbbaaa ?
正确答案:bbbaaa 。
原因:
我们知道标准io不仅仅存在于UNIX中,在很多其他的操作系统中都实现了标准io库,当然不同的操作系统标准io函数的实现是由各自系统的系统io函数封装而成的。示意图如下:
系统io 提供的函数常被称为不带缓冲的io ,如 read write 函数 每执行一次就会调用内核中的一个调用,但是标准io则不同,它提供缓冲(行缓冲 全缓冲 不带缓冲),之所以提供缓冲就是为了减少使用read和write的调用次数,可以先将数据放置到缓冲区中然后统一执行read write 函数。
行缓冲:换行符(/n)、缓冲区已满 、强制刷新(如fflush()函数) 全缓冲:缓冲区已满 、强制刷新fflush()
write 系统调用 相交与标准io 调用速度更快。 putchar 就是行缓冲,所以在这种情况下肯定是将所有a字符都输入到缓冲区中在集体输出的。
我们可以使用strace 命令查看代码的调用过程:
strace ./xxx
标准io 和 系统 io 哪个更加效率:
标准io : 暂时放置到缓冲区中,等到条件满足统一调用系统方法。 系统io: 响应及时性
至于哪个效率?不能一概而论。应该从各自的特点上出发进行抉择。
新闻热点
疑难解答