C标准库的内部工作

swa*_*ter 7 c standards

我对标准C库的内部工作感兴趣.我找到了一本关于可能的实现的好书 - 但我正在寻找对整个标准库和标准(如POSIX)的更深层次的解释 - 标准库中这些标准的定义.

C草稿非常有用,但阅读起来不是很好.还有关于这个主题的其他文献吗?

  • 标准图书馆-PJ-Plauger 1991
  • FreeBSD的
  • GNU男人
  • C草案

阿尔伯特

R..*_*R.. 6

一个很好的起点是POSIX.POSIX 2008规范可在线获取:

http://pubs.opengroup.org/onlinepubs/9699919799/

它比C标准更容易访问(但有时不那么严格),并且涵盖的不仅仅是C标准,即类Unix系统标准库的大部分标准化部分.

如果您对实现感兴趣,首先要注意的是,POSIX描述的行为通常在内核实现和用户空间libc实现之间进行分割(必要性和实用性原因).POSIX中的大量函数(以及一些来自C标准的函数)将仅仅是"系统调用"的包装器,即转换到内核空间以服务请求.在一些libc实现中,即使找到这些包装器也很困难,因为它们通常由构建脚本自动生成,和/或统一到单个汇编语言文件中.

标准库的主要(大量非内核代码)子系统通常是:

  • stdio:在glibc上,这是由GNU libio库实现的,它是C stdio和C++ iostream的统一实现,经过优化,因此不必通过成为另一个的包装器来减慢速度.这是一个很大的黑客,代码很难找到和遵循.其他实现(尤其是BSD,以及Linux上的其他libc)更简单,更清晰.最终,他们基于底层文件描述符IO功能,如open,read等.
  • POSIX线程:在glibc和现代uClibc上,这是NPTL.我不熟悉BSD的线程实现.其他Linux libcs​​缺少线程或主要基于Linux clonefutex系统调用提供自己的实现.
  • 数学库:最终,几乎所有这些都是基于90年代早期的旧的Sun数学代码,但是他们分歧很多.Fdlibm是现代libcs​​中使用的代码的相当好的基础近似.
  • 用户,组,主机名(DNS)等查找:这是通过glibc中的libnss处理的,并且直接在大多数其他libcs​​中处理.
  • 正则表达式和glob匹配
  • 时区和时区处理
  • 区域设置和字符集转换
  • 的malloc

如果你想开始阅读资料,我建议不要从glibc开始.它非常大而且笨重.如果你想阅读glibc,请注意许多代码隐藏在sysdeps树下,并根据它适用的系统的多样性进行组织.

Dietlibc非常易读,但如果您阅读它的来源,请注意它充满了常见的C编程错误(例如int,size_t在需要的位置使用,不检查溢出等).如果你记住这一点,它可能不是一个糟糕的选择,因为忽略许多可能的错误/失败往往会使代码变得非常简单.

有了这个说,为了阅读libc源,我最推荐其中一个BSD或musl(免责声明:我是musl的主要作者,所以我在这里有点偏颇).BSD还有一个优点,即内核空间代码也非常简单和可读,所以如果你想在系统调用的另一端读取内核代码,你也可以这样做.


oua*_*uah 5

在Harbison&Steele的"C:A参考手册,第五版"中,本书的第二部分专门介绍C标准库(第2部分:第10-24章).

http://careferencemanual.com

C99的基本原理文件没有涵盖C库,但ANSI C89原理在第4章中有所介绍.这里有一份文件副本:

http://www.lysator.liu.se/c/rat/title.html