以下文字翻译自Beginning Linux Programming的小节Library Functions
直接使用底层的
系统调用来输入与输出将面临一个问题,效率很低。为什么?如下:
使用系统调用时,会有性能上的代价。相比普通函数的调用,系统调用的开销大得多,因为,Linux需要从当前的程序代码的运转切换到内核代码的执行。所以,降低使用
系统调用的频率,充分利用每次的
系统调用,是占优的策略。例如,要一次性读取或写入大量的数据,而不是一个一个地来。
当使用系统调用时,硬件会约束读写时的数据块的大小。例如,磁盘驱动器对每次读写的约束是10k,所以,每当你写的数据不足10k时,下次再写入会从下一个10k的数据块开始写入,导致浪费了一段空间。
每个Linux的发行版(以及UNIX)都会提供一些标准库,来提供一些高层(higher-level)接口用于设备和硬件文件。
这是一系列可以被你的程序include的方法。一个很好的例子就是,标准的I/O库——提供了有缓冲的输出。你可以高效地写入不同大小的数据块,库函数会在数据块达到指定大小的时候使用底层的
系统调用。这有效地避免了过度调用。
库函数在用户手册(manual page)第三节中有详细文档,并且有标准的include文件,例如用于标准的I/O库的stdio.h。
以下的图,展示了与用户、设备驱动、内核以及硬件相关的函数文件所存在的位置。