熟悉 Glibc,善于利用轮子

Posted Li-Yongjun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熟悉 Glibc,善于利用轮子相关的知识,希望对你有一定的参考价值。

文章目录

轮子

一门语言有多强大,未必只看其本身,还要看其生态。
这里讲的生态是指为这门语言量身打造的库、模块、组件。
最典型的例子就是 Python,Python 为什么这么火,并不是其语法多么简单,多么优雅,而是因为其库多,各行各业都有相对应的库、框架。这就让初学 Python 的程序员很容易的就能做出不错的作品。

拒绝重复造轮子

我是一个“轮吹”,信奉能不写代码就不写代码,能少写代码就少些代码,能使用成熟模板就使用成熟模板,已有轮子就不再重复造轮子的原则。
对于 C 语言工程师来讲,学会 C 语言语法,仅仅就是学会了语法而已。
用最近比较火的一句话:听君一席话,如听一席话😂。
学会了 C 语言语法,如学会了 C 语言语法🤣,哈哈。
学会了 C 语言,就好比你学会了使用自己的四肢,能够前后左右的活动,但是你并不会开车这个技能,要想更进一步地提高自己的生存技能,你还要在此基础上进行一项项的专业训练。
对于 C 语言的训练,最好的就是 C 库。这里介绍两个标准 C 库:libc 和 Glibc。
举两个例子:

  1. 判断某个字符是否是十六进字符,没必要写成if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f'),可以写成 if (isxdigit(ch)) 这样语义更加明确,语句更加简洁,不容易出现笔误。
  2. 把大写字符转成小写字符,没必要一个个判断是否是大写字符,然后加减一个基值变成小写字符,直接调用 tolower(ch) 就好了,多简洁。

这样的工具函数有很多,需要我们不断发掘,不断运用。

libc VS Glibc

Glibc 和 libc 都是 Linux 下的 C 函数库。
libc 是 Linux 下的 ANSI C 函数库;Glibc 是 Linux 下的 GUN C 函数库。
ANSI C 和 GNU C 有什么区别呢?

libc

ANSI C 函数库是基本的 C 语言函数库,包含了 C 语言最基本的库函数。这个库可以根据头文件划分为 15 个部分,其中包括:

<ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;
<errno.h>:定义用来报告错误条件的宏;
<float.h>:包含系统的浮点数大小限制;
<limits.h>
<math.h>:包含数学库函数的函数原型;
<stddef.h>:包含执行某些计算 C 所用的常见的函数定义;
<stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;
<stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;
<string.h>:包含字符串处理函数的函数原型;
<time.h>:包含时间和日期操作的函数原型和类型;
<stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;
<signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;
<setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;
<locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。 地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;
<assert.h>:包含宏和信息,用于进行诊断,帮助程序调试。

上述库函数在其各种支持 C 语言的 IDE 中都是有的。

Glibc

GNU C 函数库是一种类似于第三方插件的东西。由于 Linux 是用 C 语言写的,所以 Linux 的一些操作是用 C 语言实现的,因此,GUN 组织开发了一个 C 语言的库 以便让我们更好的利用 C 语言开发基于 Linux 操作系统的程序。 不过现在的不同的 Linux 的发行版本对这两个函数库有不同的处理方法,有的可能已经集成在同一个库里了。
Glibc 是 linux 下面 C 标准库的实现,即 GNU C Library。Glibc 本身是 GNU 旗下的 C 标准库,后来逐渐成为了Linux 的标准 C 库,而 Linux 下原来的标准 C 库 Linux libc 逐渐不再被维护。Linux 下面的标准 C 库不仅有这一个,如 uclibc、klibc,以及上面被提到的 Linux libc,但是 Glibc 无疑是用得最多的。

glibc

glibc 是 GNU 工具链的关键组件,用于和二进制工具和编译器一起使用,为目标架构生成用户空间应用程序。glibc在/lib目录下的.so文件为libc.so.6。为什么叫 libc.so.6 呢?因为库都是以 lib 开头的,不能用 glib 开头,所以只能加后缀,所以就用版本 6 来标识 glibc。

细谈 Glibc

Glibc(GNU C Library)是 GNU 发布的 C 标准库,即 C 的运行库,是 Linux 系统中最底层的应用程序接口。

Glibc主要包含以下内容:

  • 动态库与静态库
    /lib 与 /usr/lib
  • 函数库头文件
    /usr/include
  • 函数库说明文件
    /usr/man /usr/share/man
  • 字集转换模组与区域化资料库
    /usr/lib/gconv/ 内含大量的字集转换模块,各种字集及编码方式与系统的基底字集之间的转换
    /usr/lib/locale,内含以系统基底字集写成的区域化资料库 (locale)
    /usr/share/locale/,内含可跨平台使用的区域化资料,主要是各应用程式的信息翻译部分
    /usr/share/i18n/,其内容是各区域化资料库的原始码,以及系统支援的内码对应表等
  • 时区资料库
    /usr/share/zoneinfo 目录下包含世界各地时区与格林威治时间的转换资料

Glibc 是 Linux平台 C 程序运行的基础,提供一组头文件和一组库文件,最基本、最常用的 C 标准库函数和系统函数在 libc.so 库文件中。
数学计算的 C 程序 libm.so
多线程的 C 程序 libpthread.so

Glibc 的库有静态库和动态库两个版本,都位于 /lib 和 /usr/lib 目录中,静态库的文件以 .a 为后缀名,动态库以 .so 为后缀名。

从下图可以看出,Glibc 是包含 ANSI C 的,另外 float.h、stdarg.h、limits.h 在 /usr/include/c++/9/tr1/ 下,stddef.h 在 /usr/include/linux/ 下

孰能生巧才能手到擒来

由于 Glibc 函数众多,需要我们平时积累,这样才能在项目中运用自如。我开源了一个学习 C 语言技能的仓库,其中 std_lib 部分就是学习 Glibc 的例子,我也会持续上传,作为积累。有需要的小伙伴记得加个星,⭐ C_study ⭐。

以上是关于熟悉 Glibc,善于利用轮子的主要内容,如果未能解决你的问题,请参考以下文章

程序员必须搞懂的20Java类库和API

如何搭建组件库的最小原型

基础概念——C标准C运行库和glibc

项目轮子:波浪背景

项目轮子:波浪背景

发愤图强第七天