文件I/O之C标准库函数和系统库函数区别

1.首先C标准库函数是工作在系统库函数之上的。C标准库函数在读写文件时候都有一个文件流指针。FILE*fp=NULL;// fp=fopen(F_PATH,"r");

fp文件流指针,其指向结构体如下图所示。

文件描述符指向磁盘文件,在进行文件读写操作时候是先读写到缓冲区,然后再调用系统应用层API write函数进行写操作,write将文件内容写到内核缓冲区,然后再调用内核层API sys_write进行写操作。到这样可以减少I/O操作,提高读写操作。

值得说明的是:使用C语言标准库函数fopen()每打开一个文件时候,其都会对应一个单独一个缓冲区。内核缓冲区是公用的。

刷新C标准缓冲区:缓冲区满、程序的正常结束、以及fclose操作,等都会刷新缓冲区。一般可以使用fflush()函数去刷新,值得说明的是:换行符\n 只能刷新终端文件的缓冲区。

刷新内核缓冲区:有个守护进程会定时刷新内核缓冲区。

下面以一个读写文件为例:

1.      将hello world字符写入磁盘hello.txt 文件中

2.      使用fopen打开hello.txt 文件,然后进行写

3.      写到C标准缓冲区

4.      满足刷新缓冲区条件,会调用系统应用层API write函数进行写操作

5.      write将文件内容写到内核缓冲区

6.      如果内核缓冲区没有满,系统不会立即调用内核层API sys_write将缓冲区内容写入到磁盘,有一个守护进程会定时刷新内核缓冲区。

7.      此时有一个进程B读hello.txt这个文件,发现内核缓冲区就有这个文件内容,其就不需要访问hello.txt 磁盘文件了。

具体流程如下:

时间: 2024-08-09 10:38:49

文件I/O之C标准库函数和系统库函数区别的相关文章

Linux-(C)文件读写实例(系统调用/标准I/O库)

文件在Linux中是一个非常重要的概念,几乎一切都是文件(引用Linux程序设计/Beginning Linux ProGramming,那么这次主要学习文件读写. 1.系统调用跟库函数调用区别 从实现的角度:系统调用直接对文件和设备进行访问和控制的的一组底层接口, 而标准I/O库为地城I/O调用提供了一个通用的接口,系统调用直接跟底层打交道,系统调用移植性远不如标准I/O库好. 从性能的角度:使用系统调用会影响系统的性能.与库函数调用相比,系统调用的开销要大些,因为在执行系统调用时,Linux

关于在linux下出现stdio.h文件不存在等gcc标准库不能找到的解决办法

首先说明一下我的系统配置:ubuntu 12.04     gcc 4.6.3 有几天没有使用ubuntu了,今天拿出来编程序,刚开始编译一个uboot1.1.6的代码.出现了stdio.h:没有那么个文件或目录的错误,因为我是用的arm-linux-gcc交叉编译编的,所以我刚开始怀疑是不是我的编译器有问题.后来我去编译以前写的一个网络程序 用gcc -o test test.c  然后还是出现了stdio.h:没有那么个文件或目录的错误.然后就各种google,百度.最后的解决方案是: 我的

windows下的c语言和linux 下的c语言以及C标准库和系统API

1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作系统啊!但由于c标准库的封装就实现了接口一样.但是如果往深入,我们就非常清楚了在这层封装上还有一层封装其实就是操作系统对文件操作的封装,也就是文件IO.而我们c语言的封装叫标准IO,他们有什么区别那?显然标准iO是基于文件io的,标准IO调用了文件IO,也优化了文件IO,例如引入缓存机制. 2.上面

include包含头文件的语句中,双引号和尖括号的区别

include包含头文件的语句中,双引号和尖括号的区别 #include <>格式:引用标准库头文件,编译器从标准库目录开始搜索 #incluce ""格式:引用非标准库的头文件,编译器从用户的工作目录开始搜索 预处理器发现 #include 指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中.被包含文件中的文本将替换源代码文件中的#include指令,就像你把被包含文件中的全部内容键入到源文件中的这个位置一样. #include 指令有两种使用形式 #incl

嵌入式 Linux C语言(十)——静态库函数和动态库函数

嵌入式 Linux C语言(十一)--静态库函数和动态库函数 一.静态链接库 静态链接库是obj文件的一个集合,通常静态链接库以".a"为后缀,名字格式一般为libxxx.a,由程序ar生成.静态链接库是在程序编译过程中链接的,已经将调用的相关函数拷贝到程序内部,程序运行时和静态链接库已经没有任何关系. 1.静态链接库的创建 A.编写源码库文件 源码库文件一般包含.c和.h文件, hello.c文件: #include <stdio.h> void display(void

对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较

#include <stdio.h> #include <time.h> #define N 100000 /*库比较函数:qsort(int *base,int n,int struct_size,int (*compare)(const void *,const void *))中的比较函数*/ int compare(const void *first, const void *second) { if (*(int *)first > *(int *)second)/

Maven项目pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径)

在今天的学习Maven项目中遇到的这个错误:pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径) 在Maven项目学习中,缓存问题时刻存在 我的解决办法为:选择工程右击--Maven--Update Project 网上也有其他的一些办法:大致三类 1.找到eclipse的project菜单选择clean...选项 2.选中pom.xml右击--Maven clean 3.eclipse工具栏Project--clean 总

《Linux学习并不难》文件系统管理(3):在Linux系统中创建文件系统

18.3  <Linux学习并不难>文件系统管理(3):在Linux系统中创建文件系统 使用mkfs命令可以在分区上创建各种文件系统.mkfs命令本身并不执行建立文件系统的工作,而是去调用相关的程序来执行.这里的文件系统是要指定的,比如xfs.ext4.ext3.vfat或者是msdos等. 命令语法: mkfs [选项] [设备] 命令中各选项的含义如表所示. 选项 选项含义 -t <文件系统类型> 指定文件系统类型 -v 显示详细信息 例:为/dev/sda5磁盘分区创建xfs

C++/C语言的标准库函数与运算符的区别new/delete malloc/free

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求. 对象在创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能把执行构造函数