1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > linux的底层文件i o Linux 文件I/O操作

linux的底层文件i o Linux 文件I/O操作

时间:2020-07-25 06:14:54

相关推荐

linux的底层文件i o Linux 文件I/O操作

一.缓存区

根据应用程序对文件的访问方式,即是否存在缓冲区,对文件的访问可以分为带缓冲区的操作和非缓冲区的文件操作:

a) 带缓冲区文件操作:高级标准文件I/O操作,将会在用户空间中自动为正在使用的文件开辟内存缓冲区。

b) 非缓冲区文件操作:低级文件I/O操作,读写文件时,不会开辟对文件操作的缓冲区,直接通过系统调用对磁盘进行操作(读、写等),当然用于可以在自己的程序中为每个文件设定缓冲区。

两种文件操作的解释和比较:

1、非缓冲的文件操作访问方式,每次对文件进行一次读写操作时,都需要使用读写系统调用来处理此操作,即需要执行一次系统调用,执行一次系统调用将涉及到CPU状态的切换,即从用户空间切换到内核空间,实现进程上下文的切换,这将损耗一定的CPU时间,频繁的磁盘访问对程序的执行效率造成很大的影响。

2、ANSI标准C库函数 是建立在底层的系统调用之上,即C函数库文件访问函数的实现中使用了低级文件I/O系统调用,ANSI标准C库中的文件处理函数为了减少使用系统调用的次数,提高效率,采用缓冲机制,这样,可以在磁盘文件进行操作时,可以一次从文件中读出大量的数据到缓冲区中,以后对这部分的访问就不需要再使用系统调用了,即需要少量的CPU状态切换,提高了效率。

二.缓冲区类型

标准I/O提供了3种类型的缓冲区。

在文件/usr/include/stdio.h 中可以看到:

1、 全缓冲区:这种缓冲方式要求填满整个缓冲区后才进行I/O系统调用操作。对于磁盘文件的操作通常使用全缓冲的方式访问。

2、 行缓冲区:在这种情况下,当在输入和输出中遇到换行符时,标准I/O库函数将会执行系统调用操作

3、 无缓冲区是指标准I/O库不对字符进行缓存,直接调用系统调用。标准出错流stderr通常是不带缓冲区的,这使得出错信息能够尽快地显示出来。

二.操作函数

对于任何一个给定的文件流,可以调用setbuf()和setvbuf()函数更改其缓冲区类型。

从man 手册可以看出,setbuf、buffer、setlinebuf、setvbuf都是操作文件流缓冲区的函数。这些操作函数在标准的I/O库中实现。

Setbuf():用于改变文件流缓冲区位置,此函数第一个参数为要操作的流对象,第二个参数buf 必须指向一个长度BUFSIZ 的缓冲区。如果将buf 设置为NULL,则关闭缓冲区。如果执行成功,将返回0,否则返回非0 值。

Setvbuf(): 此函数第一个参数为要操作的流对象;第二个参数buf 必须指向一个长为BUFSIZ 的缓冲区;第三个参数为缓冲区类型(可选择无缓冲区、行缓冲区、全缓冲区),第四个参数为该buf的大小。如果指定一个不带缓冲区的流,则忽略buf和size参数。如果指定全缓冲区或行缓冲区,则buf 和size 可选择地指定一个缓冲区及其长度。此函数如果执行成功,将返回0,否则返回非0 值。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。