虽然从用户的角度来看,系统调用与库函数的行为没有什么不同;但从实现者的角度来看,系统调用与库函数是完全不同的两回事。这里介绍一点两者之间的差异。
系统调用,可以理解为直接进入内核的入口点。UNIX为每一个系统调用都在标准C库中设置了一个具有相同名字的函数,这些函数用系统要求的技术调用相应的内核服务。从应用的角度来看,系统调用与C函数的行为看起来完全一致。
而通用库函数并非内核的入口点,它们可能会调用大于等于0个的系统调用。比如printf会调用write系统调用来输出字符串;而strcpy与atoi不使用任何的系统调用。通常来说,库函数是可以替换的,而系统调用一般无法替换。下面这个示意图可以解释C库函数与系统调用之间的差异:
举例来说,有很多方法进行存储空间的分配与回收,对不同的方法应用不同的策略,不存在绝对最优的方法。malloc函数使用sbrk系统调用进行空间的分配,这个系统调用按照指定的字节数进行增加/减少进程地址空间。如果不喜欢malloc的分配方式,大可以自己定义一个空间分配的函数。实际上有很多软件都应用sbrk系统调用实现自己的存储空间分配算法。