库函数与系统调用之间的区别--扩展知识点1

简介: 库函数与系统调用之间的区别--扩展知识点1

何为系统调用,系统调用是内核直接向应用层提供的应用编程接口,譬如 open、write、 read、close 等,关于这些系统调用后面会给大家进行详细介绍。编写应用程序除了使用系统调用之外,我们 还可以使用库函数,本小节来聊一聊库函数。 库函数也就是 C 语言库函数,C 语言库是应用层使用的一套函数库,在 Linux 下,通常以动态(.so) 库文件的形式提供,存放在根文件系统/lib 目录下,C 语言库函数构建于系统调用之上,也就是说库函数其 实是由系统调用封装而来的,当然也不能完全这么说,原因在于有些库函数并不调用任何系统调用,譬如一 些字符串处理函数 strlen()、

strcat()、memcpy()、memset()、strchr()等等;而有些库函数则会使用系统调用来 帮它完成实际的操作,譬如库函数 fopen 内部调用了系统调用 open()来帮它打开文件、库函数 fread()就利用 了系统调用 read()来完成读文件操作、fwrite()就利用了系统调用 write()来完成写文件操作。 Linux 系统内核提供了一系列的系统调用供应用层使用,我们直接使用系统调用就可以了呀,那为何还 要设计出库函数呢?事实上,有些系统调用使用起来并不是很方便,于是就出现了 C 语言库,这些 C 语言 库函数的设计是为了提供比底层系统调用更为方便、更为好用、且更具有可移植性的调用接口。 来看一看它们之间的区别:


第一: 库函数是属于应用层,而系统调用是内核提供给应用层的编程接口,属于系统内核的一部分;


第二: 库函数运行在用户空间,调用系统调用会由用户空间(用户态)陷入到内核空间(内核态);


第三: 库函数通常是有缓存的,而系统调用是无缓存的,所以在性能、效率上,库函数通常要优于系统调 用;


第四: 可移植性:库函数相比于系统调用具有更好的可移植性,通常对于不同的操作系统,其内核向应用 层提供的系统调用往往都是不同,譬如系统调用的定义、功能、参数列表、返回值等往往都是不一 样的;而对于 C 语言库函数来说,由于很多操作系统都实现了 C 语言库,C 语言库在不同的操作 。系统之间其接口定义几乎是一样的,所以库函数在不同操作系统之间相比于系统调用具有更好的 可移植性。 以上便上它们之间一个大致的区别,从实现者的角度来看,系统调用与库函数之间有根本的区别,但从 用户使用角度来看,其区别并不重要,它们都是 C 语言函数。在实际应用编程中,库函数和系统调用都会 使用到,所以对于我们来说,直接把它们当做是 C 函数即可,知道你自己调用的函数是系统调用还是库函数即可,不用太过于区分它们之间的差别。 所以应用编程简单点来说就是:开发 Linux 应用程序,通过调用内核提供的系统调用或使用 C 库函数来开发具有相应功能的应用程序。


目录
相关文章
|
2月前
|
缓存 Ubuntu 网络协议
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
55 1
|
2月前
|
Linux 程序员 C语言
【linux基础I/O(一)】文件描述符的本质&重定向的本质
【linux基础I/O(一)】文件描述符的本质&重定向的本质
|
2月前
|
存储 缓存 Unix
C语言第四章(进程间的通信,管道通信,pipe()函数)
C语言第四章(进程间的通信,管道通信,pipe()函数)
135 0
进程间通信——内存映射原理及详解(附有案例代码)
进程间通信——内存映射原理及详解(附有案例代码)
|
Linux C语言
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
182 0
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
|
物联网 Linux 开发者
系统调用与库函数关系|学习笔记
快速学习系统调用与库函数关系
326 0
系统调用与库函数关系|学习笔记
|
存储 网络协议 C语言
【CSAPP】x86-64的机器代码和原始的C代码差别巨大,一些常在C语言中隐藏的处理器状态
【CSAPP】x86-64的机器代码和原始的C代码差别巨大,一些常在C语言中隐藏的处理器状态
61 0
|
Unix 物联网 Linux
系统调用的概念|学习笔记
快速学习系统调用的概念
153 0
系统调用的概念|学习笔记
驱动开发:内核中枚举进线程与模块
内核枚举进程使用`PspCidTable` 这个未公开的函数,它能最大的好处是能得到进程的EPROCESS地址,由于是未公开的函数,所以我们需要变相的调用这个函数,通过`PsLookupProcessByProcessId`函数查到进程的EPROCESS,如果`PsLookupProcessByProcessId`返回失败,则证明此进程不存在,如果返回成功则把EPROCESS、PID、PPID、进程名等通过DbgPrint打印到屏幕上。
442 0
驱动开发:内核中枚举进线程与模块
|
小程序
小程序bindtap和cachetap的区别
小程序bindtap和cachetap的区别
167 0
小程序bindtap和cachetap的区别