系统调用与库函数

操作系统对于文件的操作,有两种方式,分别是 :
系统调用(system call)和库函数调用(Library functions)

在这里插入图片描述
从这个图不难看出,其实库函数的原理还是使用了系统调用;

系统调用

系统调用,我们可以理解是操作系统为用户提供的一系列操作的
接口(API),这些接口提供了对系统硬件设备功能的操作。举个例子,我们最熟悉的 hello world 程序会在屏幕上打印出信息,程序中调用了printf() 函数,而库函数 printf 是将需要打印的信息输出到屏幕这个硬件设备上。我们知道,对于所有硬件设备的操作都需要驱动程序,而驱动程序是由操作系统内核实现的。这也就意味着我们的printf()函数最终需要调用Linux内核的相关函数来操作屏幕这个设备,而这些函数就是系统调用。事实上,printf()库函数的实现里最终会调用系统调用 write() 。

库函数

库函数可以理解为是对系统调用的一层封装。系统调用作为内核提供给用户程序的接口,它的执行效率是比较高效而精简的,但有时我们需要对获取的信息进行更复杂的处理,或更人性化的需要,我们把这些处理过程封装成一个函数再提供给程序员,更方便于程序猿编码。譬如在接下来的学习过程中,我们会学习read(int fd, char *buf, int size)这个系统调用,这个函数是从某个文件(由fd)标志中,读取最多不超过size个字节的数据并存放到buf中去,在这个系统调用中我们只能指定读N个字节的数据,而对于想一次读取一行这样的需求则可以调用库函数fgets()来实现,这在《C Primer Plus》的文件/IO中讲到,当然在《C PrimerPlus》里提到的所有函数都是库函数。

区别

(1)库函数是语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分

(2)库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大

(3)库函数是有缓冲的,系统调用是无缓冲的

(4)系统调用依赖于平台,库函数并不依赖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值