问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux库函数,Linux 系统API 这两个概念有区别吗?

发布网友 发布时间:2022-04-23 06:17

我来回答

2个回答

热心网友 时间:2022-04-11 21:20

 Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四:让api也可以有了级别和专门的工作面向。
  1、系统调用
  系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h.以write为例:其函数原型为 size_t write(int fd, const void *buf, size_t nbytes),其操作对象为文件描述符或文件句柄fd(file descriptor),要想写一个文件,必须先以可写权限用open系统调用打开一个文件,获得所打开文件的fd,例如 fd=open(\逗/dev/video\地, O_RDWR)。fd是一个整型值,每新打开一个文件,所获得的fd为当前最大fd加1.Linux系统默认分配了3个文件描述符值:0-standard input,1-standard output,2-standard error.
  系统调用通常用于底层文件访问(low-level file access),例如在驱动程序中对设备文件的直接访问。
  系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。
  系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是对硬件(存储器)的操作,都必然会引起系统调用。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如C库函数fwrite()就是通过write()系统调用来实现的。
  这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢看这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲区,例如用fwrite写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。
  2、库函数调用
  标准C库函数提供的文件操作函数如fopen, fread, fwrite, fclose, fflush, fseek等,需包含头文件stdio.h.以fwrite为例,其函数原型为size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作对象为文件指针FILE *pf,要想写一个文件,必须先以可写权限用fopen函数打开一个文件,获得所打开文件的FILE结构指针pf,例如pf=fopen(\逗~/proj/filename\地, \逗w\地)。实际上,由于库函数对文件的操作最终是通过系统调用实现的,因此,每打开一个文件所获得的FILE结构指针都有一个内核空间的文件描述符fd与之对应。同样有相应的预定义的FILE指针:stdin-standard input,stdout-standard output,stderr-standard error.
  库函数调用通常用于应用程序中对一般文件的访问。
  库函数调用是系统无关的,因此可移植性好。
  由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序中对设备的操作。

热心网友 时间:2022-04-11 22:38

有 库是指函数的可执行文件实体,库函数是指函数实体。比如具体的 .o或 .so文件。库函数就是这些文件包含的函数接口和可执行代码。
API 是指应用程序接口,程序接口可以理解为 函数名 和参数表 和函数用法。这是用户方面的概念。API不涉及具体函数实现。
比如 openGL 这个标准固定了一套API。
openGL库的研发者可能有windows 的 也有linux的 也有mac的。他们会写出在不同操作系统下的不同库。但所有这些库使用同一个API。这样的话 对调用api的人来说程序就可以移植。
库和库函数是一套API的具体实现。
但在口语中 API 几乎和 库函数同义
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怀孕多久验孕棒能查出来 苹果8p屏幕有个很小的黑点,开始以为是脏东西,原来是屏幕,不仔细看看不... 剪映怎么添加音乐字幕 剪映添加音乐字幕教程 谁能帮我起个个性英文名 萧姓男孩名字2023年4月30日出生的 孩子父亲姓李是男孩1月4日下午5点20分出生叫李佳明希望行家根据五行五 ... 梦见别人买围巾 古代没有监控,青楼女子为何不逃跑,非要花大价钱赎身(不敢,也逃不了... 内蒙古2023年acca报名时间 内蒙古注会条件 电脑怎样设置蓝牙连接 蓝牙与电脑如何连接? 谁能帮忙我在千图网下素材 生活中,把妻子逼成什么样子,是丈夫的最大失职? 一个英文名字 女孩 带有萌这个字的中文意思 人到了中年,一定要把自己逼成什么样的状态? 请帮我起个女生哒英文名字。 穷会把人逼到什么样,你见过最“狼狈”的人是怎样的? 如何逼单 可爱特别的英文名 怎样看待逼读现象? 女生可爱QQ网名,别太花,最好实际一点的,也可以使英文名。Thank you! 怎样才能把逼装好 好听的女生英文名,要甜美,可爱,活泼的!! 搜狗输入法那两天打了个“*”字,然后每次打bi第二个就是“*”字,很不雅观,怎样把这个字调到后面去? qq 英文名 可爱的 长得牛逼是一种怎样的感受? 帮我取个可爱点的英文名字(女生) 口上常挂帅哥,说话常说牛“逼”傻“逼”的女人是怎样的 女生QQ英文名,可爱点,开头W Vivo v1813a有没有otg 功能? linux的API和windows的API一样吗 能互相通用吗 Ⅴiv0手机丫97屏幕跟V1813A手机屏幕是通用吗? linux下的系统调用和api有到底有什么区别 vivoy97h和v1813一样吗? 为什么linux下的API功能那么少 API到底是什么? VOViY97,1813A和1813T有什么区别 linux 系统api 和kernel api 一样么 linux的api函数哪里有,C和C++怎么调用API vivo v1813A有OTG吗 V1813A支持电信吗? linux内核提供的能够访问用户指针的api有哪些,哪些是安全的,怎么检查安全性 t恤衫穿久了衣领发黄怎么处理 vivov1813a和vivos1是同款手机壳吗? Linux操作系统API调用syscall 监控录像机录像存储时间怎样计算《模拟网络两种》最好有公式 vivo y97和v18131样吗? 白色的T恤穿几次领口就发黄了,怎么把它洗干净? API是什么意思