Linux系统编程-系统IO和标准IO的区别

系统IO和标准IO

举例:传达室老大爷跑邮局,有以下两种情况:

  • 每来一个人就跑一次邮局。
  • 等达到一定数量的信再去一次邮局。

有特殊情况,比如还未达到信的上限,但是有人比较急,这时就直接去送,有点类似与刷新缓冲区fflush。

标准IO具有缓冲的机制,看着已经写进去了,实际上是放到了输出的缓冲区中。

系统调用IO每一次都是从user态切换到kernel态,实时性高。

标准IO吞吐量大,系统调用IO响应速度快。

如何使一个程序变快?

分两个角度作答:

  • 是使程序的响应速度快
  • 是使程序的吞吐量大

从用户的角度,用户体验感觉到程序变快是指吞吐量。所以在相同情况下,标准IO和系统调用IO都能解决问题的情况下,尽量使用标准IO。

标准IO操作转换为文件IO操作

把File *传入fileno函数中,返回值是这个File文件的文件描述符。

文件IO操作转换为标准IO操作

将已经打开的文件描述符,封装到FILE *中使用。

FILE和文件描述符对应的结构体

文件描述符

下面两个结构体中的pos是否相同?

写一个伪代码:

FILE *fp;

fputc(fp) -> pos++
fputc(fp) -> pos++

执行上述代码后,左边结构体的pos加2,但是右边结构体的pos并没有加2,有一个缓冲区。写入的两个字符并没有写到磁盘上,比如用word修改,关闭时会提示是否保存修改,点保存的话刷新了文件,点不保存的话不会修改文件。

当缓冲区满了,刷新之后右边结构体的pos才会增加。

所以左右两个结构体不一样的,标准IO和文件IO最好不要混用。

代码

源代码

#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);
}

运行结果

通过strace ./ab进行观察:

三句putchar是通过一个write来实现的。

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值