C 标准库和实现
内容回顾
操作系统为我们提供了对象和操作它们的 API:我们学习了进程管理的 fork, execve, exit, waitpid;内存管理的 mmap;文件 (对象) 管理的 open, read, write, dup, close, pipe, ……大家观察到这些 API 的设计有一个有趣的原则:“非必要不实现” (“机制与策略分离”、“最小完备性原则”):但凡应用程序能自己搞定的功能,操作系统就不需要提供——在一定程度上,这样的设计能防止 “包揽一切” 导致代码膨胀,甚至在长期演化的过程中成为历史的包袱。
本讲内容:在操作系统 API 之上,为了服务应用程序,毋庸置疑需要有一套 “好用” 的库函数。虽然 libc 在今天的确谈不上 “好用”,但成就了 C 语言今天 “高级的汇编语言” 的可移植地位,以 ISO 标准的形式支撑了操作系统生态上的万千应用。
libc 简介
libc 是 C 标准库的实现,C 是世界上“最通用”的高级语言,是一种高级汇编语言,是系统调用的一层“浅封装”。
假设不能用 scanf
和 printf
进行输入和输出而只能用系统调用,显而易见这是及其麻烦的(道理上可行,工程上不行)。
minilibc 一个用于教育目的的 C 标准库的简化实现 (claude-3.7-sonnet Cursor IDE),展示了 C 库的核心组件,包括程序的启动和结束、基本的内存管理、字符串操作以及简化的 I/O 功能。该库实现了 _start 函数以设置环境,并提供了简单的 malloc, free, strlen 和 strcpy。构建该库只需运行 make 命令,生成静态库和测试程序。