一个很好的起点是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还有一个优点,即内核空间代码也非常简单和可读,所以如果你想在系统调用的另一端读取内核代码,你也可以这样做.
在Harbison&Steele的"C:A参考手册,第五版"中,本书的第二部分专门介绍C标准库(第2部分:第10-24章).
C99的基本原理文件没有涵盖C库,但ANSI C89原理在第4章中有所介绍.这里有一份文件副本:
http://www.lysator.liu.se/c/rat/title.html
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |