我对标准C库的内部工作感兴趣。我找到了一本关于可能的实现的好书 - 但我正在寻找对整个标准库和标准(如POSIX)的更深入解释 - 标准库中这些标准的定义。
C草稿非常有用,但阅读起来并不是很好。还有关于这个主题的其他文献吗?
阿尔伯图斯
答案 0 :(得分:6)
一个很好的起点是POSIX。 POSIX 2008规范可在线获取:
http://pubs.opengroup.org/onlinepubs/9699919799/
它比C标准更容易访问(但有时不那么严格),并且涵盖的内容远远超过C标准,即类Unix系统标准库的大部分标准化部分。
如果您对实现感兴趣,首先要注意的是,POSIX描述的行为通常在内核实现和用户空间libc实现之间进行分割(必要性和实用性原因)。 POSIX中的大量函数(以及来自C标准的一些函数)将仅仅是“系统调用”的包装器,即转换到内核空间以服务请求。在某些libc实现中,即使找到这些包装器也很困难,因为它们通常由构建脚本自动生成,和/或统一为单个汇编语言文件。
标准库的主要(大量非内核代码)子系统通常是:
open
,read
等。clone
和futex
系统调用提供自己的实现。如果你想开始阅读资料,我建议不要从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章)。
C99的基本原理文件没有涵盖C库,但ANSI C89原理涵盖了第4章。这里有一份文件副本: