我们都知道C语言,C语言提供了通用的函数比如fread fwrite fclose,不论你在windows linux还是其他 操作系统上,都可以使用.这就是平台无关性,所以C语言有很好的移植性.接下来我们思考一个问题,不同的操作系统windows linux,他们的设计肯定不一样的,windows再设计之处肯定不会 考虑linux的设计,linux在设计之处也不会向微软请教.所以问题是为什么都可以使用标准的C函数 ?
这要从操作系统 的系统调用说起.高级的操作系统都分为用户态和内核态,说白了用户态就是执行用户程序的,比如QQ 微信.而内核是 操作系统管理硬件 内存 CPU的,应用程序因为在用户态所以无法访问硬件,这也保证了操作系统的安全性. 但是有时候应用程序需要操作硬件,比如打开摄像头,那怎么办呢.
解决办法就是用户程序请求操作系统打开,操作系统接收请求去打开硬件.所以真实的访问过程不是应用程序直接访问. 应用程序如何请求操作系统呢?这就是系统调用的功能.因为不同的操作系统管理方式 硬件访问方式几乎完全不同,所以不同的操作系统提供了完全不同的系统调用接口.这些接口 又称为系统函数.
比如常见的linux下API:read write close open socket都是系统函数 ,可以完成操作系统的各种功能.windows上API 是不相同的,所以如果你直接使用这些系统函数,写出来的代码不具有移植性.
那怎么办呢?解决方法就是对系统函数封装一层,封装为C库. C库 对外提供统一的接口,不同的操作系统提供不同的C库,但是不同的C库对外提供相同的 API,这也就保证了你基于C库开发的代码在不同的操作系统上具有 很好的移植性.记住,是很好,而不是绝对的.针对一些特殊的功能,我们也是针对操作系统进行处理.
下面一张图来解释他们之间的关系: