C库的分类、区别
libc:Linux下的ANSI C函数库,是基本的C语言函数库,一般在各种IDE中都有集成。
glibc:Linux下的GNU C函数库,是GNU旗下的C标准库,在linux系统的/lib目录下的名称为libc.so.6。glibc支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大。可以参考:http://nieyong.github.io/wiki_ny/glibc,%20eglibc%E5%92%8C%20glib%E7%9A%84%E5%8C%BA%E5%88%AB.html
Linux中除了以上两种标准C库外,还有uclibc、klibc等库。Linux中目前正在维护的是glibc库。
下面参考维基百科对uclibc、klibc进行解释:
klibc,一种C标准函式库,开发者为汉·彼得·艾文(Hans Peter Anvin)。它是自由软体,采用GNU 通用公众授权条款或BSD授权条款。它主要应用于Linux开机流程中,而且它也是早期用户空间(Early user space)与initramfs的一部份。在此时,这些应用程式无法使用glibc。它也适用于嵌入式系统的开发。
uClibc 是一个面向嵌入式Linux系统的小型的C标准库。最初uClibc是为了支持uClinux而开发,这是一个不需要内存管理单元的Linux版本,因此适合于微控制器系统。uClibc比一般用于Linux发行版的C库GNU C 函式库 (glibc)要小得多,glibc目标是要支持最大范围的硬件和内核平台的所有C标准,而uClibc专注于嵌入式Linux。很多功能可以根据空间需求进行取舍。uClibc运行于标准的以及无MMU的Linux系统上,支持i386,x86 64,ARM (big/little endian), AVR32,Blackfin,h8300,m68k,MIPS (big/little endian),PowerPC,SuperH (big/little endian),SPARC,和v850等处理器。
dietlibc,一种轻量化的C标准库。它是自由软件,由菲力·冯·勒特那(Felix von Leitner)所开发,以GNU 通用公共许可协议第二版公开发行。它的设计目标,是作出一个尽可能小的C标准库,因此它并没有完全实现出所有glibc的函数,只保留了最重要以及最常用的部分。因为它的精简特性,经常在嵌入式系统中被使用。
对于做Linux C应用开发的程序员来说,无论你是x86还是arm下的开发,大部分情况下很难感受到上述C库的区别,因为Linux下C应用开发使用的C库是glibc,不同Linux系统顶多就是glibc的版本不一样而已,版本上的差异很难在应用开发中体现出来。(不过,需要注意的是,不同平台下的glibc库,哪怕版本一样,也是有区别的。因为glibc库(.so文件)也是用编译器编译出来的,而不同的CPU平台使用的编译器不一样,编译出来的glibc库也会不一样。这也是为什么当我们需要升级某个arm平台的glibc库版本时,不能直接copy x86下的高版本的glibc库(.so文件),而只能下载高版本glibc的源码并配置交叉编译工具进行编译后才能移植使用的原因)
但是对于既做Linux C应用开发,又做单片机裸机C编程的程序员来说,还是可以感受到C库的区别的。比如,在Linux系统下,你可以很方便的使用sleep()函数来进行延时操作,但是到了某些单片机下就不能使用sleep()了,因为单片机编译器所支持的C库与glibc不同,一般单片机编译器所支持的C库更精简,很多glibc的库函数都不支持,所以Linux下的C应用程序不能直接移植到单片机下,一般都需要做修改。
C库函数与(Linux)系统调用的区别、联系
c库函数是上一节提到的c库里面的函数,是用户空间的应用编程接口,比如fopen、fread、fwrite
系统调用是操作系统提供的接口(内核函数),运行在内核空间,比如open、read、write
c库函数中有的底层就是调用了对应的系统调用(内核函数),比如fopen最终就调用了open。用户空间的库函数调用内核函数就相当于发生系统调用,也就意味着CPU要从用户态切换到内核态(通过内核软中断陷入内核态),只有切换到内核态才能执行内核函数,c库函数是无法在内核中使用的。
进一步的了解可参考:
https://blog.youkuaiyun.com/gatieme/article/details/50779184
https://blog.youkuaiyun.com/guidao13/article/details/53844136
Linux中的系统调用列表可参考:https://blog.youkuaiyun.com/sah/article/details/144147
C库源码下载
dietlibc库比较精简,适合学习研究,有篇文章推荐了阅读dietlibc库源码:https://sunxiunan.com/archives/1626
glibc库源码下载:http://ftp.gnu.org/gnu/glibc/
dietlibc库源码下载:http://www.fefe.de/dietlibc/