库函数

  1. 把一些常用到的函数编完放到一个文件里,供别人用。别人用的时候把它所在的文件名用#include<>加到里面就可以了。一般是放到lib文件里的。一般是指编译器提供的可在c源程序中调用的函数。可分为两类
  • 一类是c语言标准规定的库函数
  • 一类是编译器特定的库函数。

    (由于版权原因,库函数的源代码一般是不可见的,但在头文件中你可以看到它对外的接口)

  1. libc中就是一个C标准库,里面存放一些基本函数,这些基本函数都是被标准化了的,而且这些函数通常都是用汇编直接实现的。
  2. 库函数一般可以概括的分为两类,
  • 一类是随着操作系统提供的
  • 一类是由第三方提供的
  1. 随着系统提供的这些库函数把系统调用进行封装或者组合,可以实现更多的功能,这样的库函数能够实现一些对内核来说比较复杂的操作。比如,read()函数根据参数,直接就能读文件,而背后隐藏的比如文件在硬盘的哪个磁道,哪个扇区,加载到内存的哪个位置等等这些操作,程序员是不必关心的,这些操作里面自然也包含了系统调用。而对于第三方的库,它其实和系统库一样,只是它直接利用系统调用的可能性要小一些,而是利用系统提供的API接口来实现功能(API的接口是开放的)。部分Libc库中的函数的功能的实现还是借助了系统掉调用,比如printf的实现最终还是调用了write这样的系统调用;而另一些则不会使用系统调用,比如strlen, strcat, memcpy等。

系统库函数

  1. 是操作系统为用户态运行的进程和硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层。
  2. 可以说是操作系统留给用户程序的一个接口。再来说一下,linux内核是单内核,结构紧凑,执行速度快,各个模块之间是直接调用的关系。放眼望整个linux系统,从上到下依次是
  • 用户进程->linux内核->硬件。

    其中系统调用接口是位于Linux内核中的,如果再稍微细分一下的话,整个linux系统从上到下可以是:

  • 用户进程->系统调用接口->linux内核子系统->硬件


    也就是说Linux内核包括了系统调用接口和内核子系统两部分;或者从下到上可以是:

  • 物理硬件->OS内核->OS服务->应用程序,

其中操作系统起到“承上启下”的关键作用,向下管理物理硬件,向上为操作系服务和应用程序提供接口,这里的接口就是系统调用了。

一般地,操作系统为了考虑实现的难度和管理的方便,它只提供一少部分的系统调用,这些系统调用一般都是由C和汇编混合编写实现的,其接口用C来定义,而具体的实现则是汇编,这样的好处就是执行效率高,而且,极大的方便了上层调用。

标准库函数

  1. C语言程序设计里,**C 标准函数**(C Standard library)是所有符合标准的头文件(head file)的集合,以及常用的函数库实现程序,例如 I/O输入输出和字串符控制。不像 COBOLForrian PL/I等编程语言,在 C 语言的工作任务里不会包含嵌入的关键字,所以几乎所有的 C 语言程序都是由标准函数库的函数来创建的。
  1. 1 assert.h
  2. 2 ctype.h
  3. 3 errno.h
  4. 4 float.h
  5. 5 limits.h
  6. 6 locale.h
  7. 7 math.h
  8. 8 setjmp.h
  9. 9 signal.h
  10. 10 stdarg.h
  11. 11 stddef.h
  12. 12 stdio.h
  13. 13 stdlib.h
  14. 14 string.h
  15. 15 time.h