标准IO(高级磁盘IO)
应用层C语言库函数提供了一些用来做文件读写的函数列表,叫标准IO。
标准IO有一系列的C库函数构成(fopen,fclose,fwrite,fread),这些标准IO函数其实是由文件IO封装而来的(fopen内部还是调用了open);
我们通过fwrite写入的内容不是直接进入内核中的buf,而是先进入应用层标准IO库自己维护的buf中,然后标准IO库自己根据操作系统单次write的最佳count来选择好的时机来完成write到内核中的buf中。
因此,标准I/O封装了底层系统调用更多的调用函数接口。
- 是由ANSI C 联合 ISO标准定义的,属于c库调用(glibc,libc)
- 通过man 3查看
- 通过缓冲机制减少系统调用的次数,可以高执行效率
- 跨平台
- 通过文件指针(FILE * 结构体)操作文件
- 全缓存 4k(默认大小)
刷新条件:
1.满了
2.程序正常结束(ctrl c 不算)
3.fflush 冲刷- 行缓存 1k
刷新条件:
1.‘\n’’
2.满了
3.程序正常结束(ctrl c 不算)
4.fflush 冲刷- 无缓存 0k
文件IO(低级磁盘IO)
文件I/O是操作系统封装了一系列open、close、write、read等API函数构成的一套用来读、写文件的接口供应用程序使用,通过这些接口可以实现对文件的读写操作,但是效率并不是最高的。
文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立刻触发系统调用过程,即向系统内核发出请求之后,系统内核会收到执行相关代码处理的请求,决定是否将操作硬件资源或返回结果给应用程序。
- 使用文件描述符(fd文件描述符) 0~1023的整数值(非负整数)操作文件
- 是由POSI X定义(POSIX–》可移植的操作系统接口)
- 非缓冲机制
文件I/O和标准I/O的本质区别
1. 缓冲区:标准I/O函数接口在对文件进行操作时,首先操作缓存区,等待缓存区满足一定的条件时,然后再去执行系统调用,真正实现对文件的操作。 而文件I/O不操作任何缓存区,直接执行系统调用。
2. 系统开销:使用标准I/O可以减少系统调用的次数,提高系统效率。例如,将数据写入文件中,每次写入一个字符。采用文件I/O的函数接口,每调用一次函数写入字符就会产生一次系统调用。而执行系统调用时,Linux必须从用户态切换到内核态,处理相应的请求,然后再返回到用户态,如果频繁地执行系统调用会增加系统的开销。
3. 执行效率:采用标准I/O的函数接口,每调用一次函数写入字符,并不着急将字符写入文件,而是放到缓存区保存,之后每一次写入字符都放到缓存区保存。直到缓存区满足刷新的条件(如写满)时,再一并将缓存区中的数据写入文件,执行一次系统调用完成此过程,这样便很大程度地减少了系统的调用次数,提高了执行效率。