Linux系统编程15 系统调用IO - 系统IO和标准IO比较实例

文件IO 与 标准IO 的区别:

举例:传达室老大爷跑邮局
方法一:来一份邮件 跑一次邮局
方法二:积攒到自己能够运载的邮件数量后,假设为100封信。跑一次邮局
方法三:在接收邮件过程中,还没有达到自己能够运载的邮件数量100,忽然有一封加急邮件,则带着加急邮件以及前面接收到的邮件,跑一次邮局。

老大爷送信任务相当于缓冲区操作,而加急动作相当于 fflush()刷新缓冲区。

标准IO 具有缓冲机制,也就是 标准IO 的操作,并不是操作完后就马上执行,而是放到的当前文件的缓冲区中,此时并没有真正的写到磁盘中去,等到 缓冲区 满了 或者 换行 或者 强制刷新的时候,即适配 行缓冲,全缓冲,无缓冲等情况。 才会一起执行动作,即刷新后 调用系统IO 写到磁盘。

系统调用IO 是 每调用一次就 实实在在的 从user态 切换到 kernel 态 去执行一次,也就是说 系统调用IO 的实时性非常高

所以说 系统调用IO的效应速度快。标准IO的吞吐量大,即可以合并系统调用IO

文件IO 转换 标准IO :fileno(), fdopen()

标准IO 与 文件IO 不可以混用。
标准IO 与 文件IO 不可以混用,因为 标准IO 操作后 如果没有刷新,文件的改动并没有写道磁盘,也就说 与之对应的 文件IO 并没有被执行,即 文件属性结构体空间 中的信息并没有与 FILE * 中的信息同步。按照下图说明的话,就是 假如标准IO 执行两次 fputc(fd)操作, 但是没有刷新,那么 FILE 中的 pos 有随之 pos++, 但是由于可能没有刷新缓冲区,则对应的文件并可能没有改动,即对应的文件IO 中文件属性结构体并没有更新,此时文件属性结构体中的pos 与 FILE中的pos ,j即文件当前位置指针是不一样的,那么什么时候刷新缓冲区呢,即行缓冲,全缓冲,无缓冲等情况,缓冲后,文件属性结构体中的pos一次性加到 FILE中的pos值。

类似于 我们再写 world 的时候,写到一半,关闭文档,这时候会提示 是否保存已写内容,这个提示就是 是否刷新缓冲区,此时的FILE 中信息 与 文件属性结构体中信息并不同步,点击“是”之后,表示刷新缓冲区,这时候才会同步信息,即将改动的内容写到磁盘。
在这里插入图片描述

实验1: 标准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);
}
mhr@ubuntu:~/work/linux/sysio/15$ gcc ab.c 
mhr@ubuntu:~/work/linux/sysio/15$ ./a.out 
bbbaaamhr@ubuntu:~/work/linux/sysio/15$ 

输出 bbbaaa

用 strace 命令查看 可执行程序的系统调用是如何发生的

mhr@ubuntu:~/work/linux/sysio/15$ 
mhr@ubuntu:~/work/linux/sysio/15$ strace ./a.out 
....
.....
.... 
write(1, "b", 1b)                        = 1
write(1, "b", 1b)                        = 1
write(1, "b", 1b)                        = 1
write(1, "aaa", 3aaa)                      = 3
exit_group(0)                           = ?
+++ exited with 0 +++
mhr@ubuntu:~/work/linux/sysio/15$ 

首先输出三个 文件IO 的 b
write(1,“b”,1);
write(1,“b”,1);
write(1,“b”,1);

另外三个 标准IO 的
putchar(‘a’);
putchar(‘a’);
putchar(‘a’);
则是将 a 放在了输出的缓冲区中,最后刷新缓冲区,即调用文件IO write(),用一次 write ,即 write(缓冲区中的所有a),注意并不是调用了多次 write, 而是只调用一次write ,一次性把缓冲区中的内容全部写进。

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/105903189