首页 > 学院 > 开发设计 > 正文

从一个小例子理解stdio 和 sysio

2019-11-06 07:01:33
字体:
来源:转载
供稿:网友

系统环境 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: 响应及时性

至于哪个效率?不能一概而论。应该从各自的特点上出发进行抉择。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表