文件操作接口四:(系统调用与库函数)
1. 系统调用与库函数区别
1. 系统调用定义:
进程直接调用内核暴露出来的的接口的方式称为系统调用
2.库函数定义:
调用将内核暴露出来的接口封装好的函数的方法为库函数的调用
注:有的库函数不需要封装内核暴露出来的接口
3.运行位置
库函数:在用户态调用,在用户态执行
系统调用函数:在用户态调用,在内核态执行
4.执行效率
当处理的数据量比较小时,函数库的函数执行效率比较好
因为函数库的函数的作法是将要处理的数据先存入缓冲区内,等到缓冲区装满了,再将数据一次写入或者读出。这种方式处理小量数据时效率比较高。但是在进行系统调用时,因为用户进程从用户模式进入系统内核模式,中间涉及了许多额外的任务的切换工作,这些操作称为上下文切换,此类的额外工作会影响系统的执行效率。
5.关联
系统调用通常是用于底层文件的访问
例如在驱动程序中对设备文件的直接访问
库函数是对系统调用的一层封装
因此在用库函数对文件操作的时候,必然会引起系统调用。也就是说,库函数调用实际上是通过系统调用实现的,例如:C库函数fwrite()就是通过write实现的。
6.用户态切换内核态
1、调用系统调用函数 → 软中断
2、缺页异常 → 硬中断
7.缓冲区
分为输入缓冲区(scanf)、输出缓冲区(printf)
输出缓冲区的条件:
1、程序结束(不能以_exit/_Exit结束);
2、遇到“\n”;
3、主动刷新fflush(stdout);
4、缓冲区满
参考
https://blog.csdn.net/like_that/article/details/90347492