系统调用函数与库函数

本文介绍了系统调用和库函数的基本概念,系统调用作为操作系统与应用程序的接口,主要用于底层硬件交互,如文件操作。而库函数是预编译的常用功能集合,简化了编程工作。两者在执行环境、性能开销、可移植性等方面存在显著差异,系统调用通常涉及更多的系统资源和更低级的操作,而库函数更侧重于应用层面的便捷性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是系统调用函数和库函数

        系统调用函数是指:通向操作系统本身的接口,是面向底层硬件的。可以使得用户态的进程与硬件设备(如CPU,磁盘,打印机)进行交互的,是操作系统留给应用程序的一个接口。如一下

                          open:    打开文件或设备

                           read:    从打开的文件或设备中读取数据

                           write:  向打开的文件或设备中写入数据

                           close:关闭文件或者设备

                           ioctl:把控制信息传递给设备驱动文件

        用户进程在发生系统调用的时候,内核将调用内核相关的函数来实现(如sys_read(),sys_write(),sys_fork()) 。用户程序不能直接调用这些函数,这些函数运行在内核态,CPU通过软中断切换到内核态,开始执行内核调用函数。

              用户态–>系统调用–>内核态–>返回用户态

        实际上使用系统调用会影响系统的性能,在执行调用的从用户态到内核态,在返回到用户态,有系统开销。为了减少开销,因此要减少系统调用的次数,并且让每次系统调用尽可能多的完成任务。硬件也会限制对底层系统调用一次所能写的数据块的大小。

         库函数是指:把函数放到库里面,供别人使用的一种方法,把一些常用的函数编写完放到一个文件里面,供不同的人进行调用。一般放在.lib文件中。库函数调用是面向应用开发的,库函数可以分为两类,一类是c语言标准规定的库函数,另一类是编译器特定的库函数。

        随着系统提供的这些库函数把系统调用进行封装或者组合,可以实现更多的功能,这些库函数能够实现一些对内核来说比较复杂的操作。比如,read()函数根据参数,直接就能读文件,而背后隐藏的比如文件在硬盘的哪个磁道,哪个扇区,加载到内存的哪个位置等等这些操作,程序员是不必关心的,这些操作里面自然也包含了系统调用。 而对于第三方的库,它其实和系统库一样,只是它直接利用系统调用的可能性要小一些,而是利用系统提供的API接口来实现功能(API的接口是开放的)。比如printf的实现最终还是调用了write这样的系统调用;而另一些则不会使用系统调用,比如strlen, strcat, memcpy等。  

二.系统调用函数与库函数的区别

     1. 系统调用是为了方便使用操作系统的接口,而库函数则是为了人们编程的方便。

      2.  库函数调用与系统无关,不同的系统调用库函数,库函数会调用不同的底层函数来实现,因此可移植性好。由于库函数是基于c库的,因此不能用于内核对于底层驱动设备的操作。

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

      4.库函数在用户地址空间执行,系统调用是在内核地址空间执行的。

      5.库函数的运行时间属于用户的时间,系统调用属于系统时间,库函数开销较小,系统函数开销较大。

      6.库函数是缓冲的,系统调用是无缓冲的。

      7.系统调用依赖于平台,库函数不依赖。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值