Linux下对文件操作有两种方式:系统调用(system call)库函数调用(Library functions)。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四:让api也可以有了级别和专门的工作面向。

一、简介

系统调用(英语:system call),指运行在用户空间的应用程序向操作系统内核请求某些服务的调用过程。 系统调用提供了用户程序与操作系统之间的接口。一般来说,系统调用都在内核态执行。由于系统调用不考虑平台差异性,由内核直接提供,因而移植性较差(几乎无移植性)。

库函数(library function),是由用户或组织自己开发的,具有一定功能的函数集合,一般具有较好平台移植性,通过库文件(静态库或动态库)向程序员提供功能性调用。程序员无需关心平台差异,由库来屏蔽平台差异性。

二、概念

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库的,因此也就不可能用于内核空间的驱动程序中对设备的操作。

三、区别

调用※函数库调用 VS 系统

函数库调用 系统调用
平台移植性好 依赖于内核,不保证移植性
调用函数库中的一段程序(或函数) 调用系统内核的服务
一个普通功能函数的调用 是操作系统的一个入口点
用户空间执行 内核空间执行
它的运行时间属于“用户时间” 它的运行时间属于“系统”时间
属于过程调用,调用开销较小 在用户空间和内核上下文环境间切换,开销较大
库函数数量较多 UNIX中大约有90个系统调用,较少
典型的C函数库调用:printf scanf malloc 典型的系统调用:fork open write

四、联系

一般而言,跟内核功能与操作系统特性紧密相关的服务,由系统调用提供;
具有共通特性的功能一般需要较好的平台移植性,故而由库函数提供。

库函数与系统调用在功能上相互补充,如进程间通信资源的管理,进程控制等功能与平台特性和内核息息相关,必须由系统调用来实现

文件 I/O操作等各平台都具有的共通功能一般采用库函数,也便于跨平台移植。某些情况下,库函数与系统调用也有交集,如 库函数中的I/O操作的内部实现依然需要调用系统的I/O方能实现。

Unix——系统调用和库函数调用概念区别和联系相关推荐

  1. linux系统调用和库函数调用的区别

    1.系统调用 系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h.以write为例:其函数原型为 size_t write(int fd ...

  2. 转载 linux系统调用和库函数调用的区别

    源地址 http://blog.csdn.net/zhangskd/article/details/6956638 Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(L ...

  3. (转)Linux系统调用和库函数调用的区别

    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions). 系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意 ...

  4. 系统调用和库函数调用的区别

    从程序完成的功能来看,函数库提供的函数通常是不需要操作 系统 的服务. 函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到核心态的.系统调用是要求操作系统为用户提供进程,提供某种服务 ...

  5. 系统调用和库函数调用

    借鉴https://blog.csdn.net/lf_2016/article/details/54587020 系统调用:用户直接调用操作系统暴露出来的接口,这种方式成为系统调用. 文件I/O操作就 ...

  6. linux中系统调用和库函数的区别

    linux中系统调用和库函数的区别 2013-05-03 22:18:20 分类: LINUX 首先,要说一下两者的概念: 系统调用 :是操作系统为用户态运行的进程和硬件设备(如CPU.磁盘.打印机等 ...

  7. 系统调用和库函数的区别

    首先,要说一下两者的概念: 系统调用 :是操作系统为用户态运行的进程和硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层.可以说是操作系统留给用 ...

  8. 操作系统原理,系统调用,系统调用与库函数API等函数之间的调用关系,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB

    操作系统原理,系统调用,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB 一.系统调用:操作系统功能调用,用户在编程时可以调用的操作系统功能. 1.系统调用是操作 ...

  9. 如何利用JDK8彻底弄懂UNIX时间戳与时区的概念!

    一.背景: 最近有一个关于店铺数据实时分析的需求,需要实时统计店铺当天的数据:例如访客数,浏览量.商品排行榜等.由于店铺可以自主选择店铺所在时区(全球二十四个时区),而数仓统计后落库的时间是GMT+8 ...

最新文章

  1. java中Class.forName与new
  2. Java 读取 dwg 转换 dxf
  3. PNAS:水稻微生物组
  4. dede日期时间标签调用大全
  5. Flex4之与后台服务器通信方式:URLRequest+URLLoader【JAVA方式】
  6. Collection和Collections之间的使用与区别
  7. unity android 分包,Unity以分包(obb)形式集成到安卓原生 我慢慢填坑
  8. android 安全 权限,[原创]Android 中的那些权限
  9. 【概率论】极大似然估计和最大后验估计
  10. Oracle中动态SQL详解(EXECUTE IMMEDIATE)
  11. ITIL 2011 -- 服务运营的5个流程简介
  12. LUA脚本(游戏辅助) 点击函数 区域单点多点着色
  13. 河南省旅游服务中心信息中心备份及集成
  14. 基于深度学习的医学图像分割学习笔记(九)UNet 3+
  15. 随机森林输出特征重要程度
  16. Validform_v5.3.2 自定义规则
  17. 网络流量大数据分析平台(1)
  18. 2022年最新贴吧gif防删图制作过程解析?当你学会防图,你就能随心所欲的控图
  19. OA是什么?对企事业单位的发展起何作用?
  20. MIC29302WU不调压的问题

热门文章

  1. python版本年份_Python问题:至今的年份和年份?
  2. 如何卸载ubuntu下的terminator
  3. StyleGAN-基于样式的生成对抗网络(论文阅读总结)(精)
  4. [Godot] Unity 的 animator 与 Godot 的 animplayer 的一点不同
  5. jupyter问题: failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
  6. PS命令总结-实战经验
  7. 版权文字:Power by DedeCms 如何去除?
  8. WordPress广告管理插件Adning Advertising1.5.8汉化版
  9. python中if语句使用_Python学习笔记之if语句的使用示例
  10. 小说精品屋plus v2.7.0源码