问题:
- 何为应用编程
- 何为系统调用
- 何库函数
1. Linux应用编程
Linux硬件平台下的软件开发,大概可以分为三类:
- 裸机编程
- 没有操作系统支持,直接在硬件上进行编程,如单片机开发
- 驱动编程
- 基于内核驱动框架开发驱动程序(通过调用Linux内核接口,完成设备驱动的注册,驱动程序负责底层硬件操作相关逻辑)
- 应用编程:
- 基于Linux操作系统的应用编程,在应用程序中,通过调用系统调用API完成应用程序的功能和逻辑,应用程序运行于操作系统之上。
操作系统下有两种不同的状态:
- 内核态
- 用户态
应用程序运行在用户态,而内核运行在内核态
2. 库函数
系统调用:内核直接向应用层提供的应用编程接口,如
- open
- write
- read
- close
- ...
编写应用程序,除了使用系统调用之外,还可以使用库函数
库函数:C语言库函数
C语言库是应用层使用的一套函数库(其实就是系统调用的封装),Linux下通常以.so形式提供,存放在/lib下
-------当然,有些库函数并不调用任何系统调用,如strlen, strcat, memcpy, memset...
而有些库则是使用系统调用完成它的实际工作,如:
fopen ---> open
fread -->read
fwrite --> write
Linux有系统调用,为毛还要有库函数的存在?
无非就是:
- 不好用
- 移植性不好
- 性能不好
库函数 vs 系统调用
库函数 | 系统调用 | ||
属于 | 应用层 | 系统内核 | |
运行 | 应用空间 | 会从用户态陷入到内核态 | |
缓存 | 有 | 无 | 性能上库函数 > 系统调用 |
移植 | 好 | 坏 | 不同操作系统,系统调用可能不同 |