系统调用是应用程序与内核之间联系的一条纽带,扮演着使者的身份。当应用程序需要内核帮它做点事情的时候,就可以通过系统调用把应用程序的要求传递给内核。系统调用隔离了用户空间和内核空间,使应用程序无法任意访问内核,保证了Linux操作系统的稳定可靠。
系统调用的另外一个好处就是屏蔽的内核底层的实现方法,用户空间的应用程序无需知道自己用的是什么架构的处理器,使用怎样的存储芯片等,便可以用统一的接口实现想要的功能。
但程序员在编程的时候似乎也很少接触系统调用,一般不直接使用系统调用的接口去编程,而是使用的标准的API进行编程,而这些标准的API都来自于某一个函数库,比如C库。C库提供了C语言各种标准函数的接口。程序员知道直接调用就可以,并不关心C库底层是如何实现的。
其实C库的实现跟系统调用息息相关。C库通过一个或多个系统调用加上一些格式,功能的调整,然后组合成了一个C函数供程序员使用。比如printf()就使用了write()这个系统调用,printf()也加上了一些格式化的东西,比如用%d表示整型数。
所以一般函数库是对系统调用的封装,为程序员提供统一的API,程序员仅使用这些API即可完成编程。哪怕在别的操作系统,程序员也可能使用相同的API进行编程。比如标准C函数,在windows系统上可以使用,在Linux上面也可以使用。但windows上面的标准C库和Linux上面的标准C库是不同的,因为两个系统的系统调用差别是很大的,需要使用不同的C库。这就是为什么不同操作系统的函数库不能通用的原因。
领取专属 10元无门槛券
私享最新 技术干货