C标准库的内部工作

时间:2012-04-02 16:35:20

标签: c standards

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

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

  • Standard-Library-P-J-Plauger 1991
  • FreeBSD的
  • GNU man
  • C draft(s)

阿尔伯图斯

2 个答案:

答案 0 :(得分: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函数,如openread等。
  • 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还有一个优点,即内核空间代码也非常简单和可读,所以如果你想在系统调用的另一端读取内核代码,你也可以这样做。

答案 1 :(得分:5)

Harbison& Sons的“C:A Reference Manual,Fifth Edition”。 Steele,本书的第二部分专门介绍C标准库(第2部分:第10-24章)。

http://careferencemanual.com

C99的基本原理文件没有涵盖C库,但ANSI C89原理涵盖了第4章。这里有一份文件副本:

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