转载链接: https://www.pianshen.com/article/2679580006/.
系统调用,API,运行库函数和C标准库函数
在linux中,将程序的运行空间分为内核与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,用户程序不能直接访问内核数据,也无法直接使用内核函数。
系统调用
系统功能调用是操作系统提供给程序设计人员的一种服务,系统调用非常精简,通常有两百多个,现在可能有三百个。
程序设计人员在编写程序时,可以利用系统调用来请求操作系统的服务。
系统调用实际上是内核中的一些函数,他们有各自对应的响应函数
响应函数sys_xxx
例如:
系统调用fork()的响应函数是sys_fork()(见Kernel/fork.c),
exit()的响应函数是sys_exit()(见kernel/fork.)。
实际上,Linux中每个系统调用都有相应的系统调用号作为唯一的标识,内核维护一张系统调用表,sys_call_table,表中的元素是系统调用函数的起始地址,而系统调用号就是系统调用在调用表的偏移量。
系统调用就是一种特殊的接口。通过这个接口,用户可以访问内核空间。系统调用规定了用户进程进入内核的具体位置。
具体步骤:用户进程–>系统调用–>内核–>返回用户空间。
API
API(Application Programming Interface)应用程序接口,是一些预先定义的函数,提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
一个单独的API可能调用几个系统调用;
不同的API可能调用了同一个系统调用。
库函数
顾名思义是把函数放到库里,是把一些常用到的函数编完放到一个文件里,供别人用。别人用的时候把所在的文件名用#include<>加到里面就可以了,一般放到lib文件里。
库函数一般分为两类:
一种是C语言标准规定的库函数
一类是编译器特定的库函数
libc就是一个C标准库,里面放着一些基本的函数,这些函数都被标准化了。
事实上,系统调用所提供给用户的是直接而纯碎的高级服务,如果想要更加人性化,具有更符合特定情况的功能,那么就要我们用户自己定义,因此衍生了库函数,它把部分系统调用包装起来。