Linux的应用编程接口(API)遵循了在Unix世界中最流行的应用编程接口标准——POSIX标准。POSIX标准是针对API而不是针对系统调用的。判断一个系统是否与POSIX兼容要看它是否提供了一组合适的应用编程接口,而不管对应的函数是如何实现的。事实上,一些非Unix系统被认为是与POSIX兼容的,是因为它们在用户态的库函数中提供了传统Unix能提供的所有服务。
应用编程接口(API)其实是一个函数定义, 比如常见的read()、malloc()、free()、abs()函数等,这些函数说明了如何获得一个给定的服务;而系统调用是通过软中断向内核发出一个明确的请求。
API有可能和系统调用的调用形式一致,比如read()函数就和read()系统调用的调用形式一致。但是,情况并不总是这样,这表现在两个方面,一种是几个不同的API其内部实现可能调用了同一个系统调用,例如,Linux的libc库实现了内存分配和释放的函数malloc( )、calloc( )和free( ),这几个函数的实现都调用了brk( )系统调用;另一方面,一个API的实现调用了好几个系统调用。更有些API甚至不需要任何系统调用,因为它们不需要内核提供的服务,如计算整数绝对值的abs()函数。
从编程者的观点看,API和系统调用之间没有什么差别,二者关注的都是函数名、参数类型及返回代码的含义。然而,从设计者的观点看,这是有差别的,因为系统调用的实现是在内核完成的,而用户态的函数是在函数库中实现的。