C库及库函数、系统调用

本文介绍了C库的分类,包括libc、glibc、uclibc和dietlibc,强调了在不同场景下的适用性和特点。讨论了C库函数与Linux系统调用之间的差异,指出C库函数如fopen可能底层调用系统调用,并解释了用户空间到内核空间的切换。同时提供了C库源码下载链接供学习研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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系统上,支持i386x86 64ARM (big/little endian), AVR32Blackfinh8300m68kMIPS (big/little endian),PowerPCSuperH (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/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值