Хорошей отправной точкой будет POSIX.Спецификация POSIX 2008 доступна здесь:
http://pubs.opengroup.org/onlinepubs/9699919799/
Она более доступна (но иногда менее строга), чем стандарт C, и охватывает гораздо больше, чем просто стандарт C, т.е.большинство стандартизированных частей стандартных библиотек Unix-подобных систем.
Если вы заинтересованы в реализациях, первое, что нужно знать, это то, что поведение, описанное в POSIX, обычно разделяется (по необходимости и прагматично).причины) между реализацией ядра и реализацией libc пользовательского пространства.Большое количество функций в POSIX (и несколько из стандарта C) будут просто обертками для «системных вызовов», то есть переходов в пространство ядра для обслуживания запроса.В некоторых реализациях libc даже найти эти обертки будет сложно, поскольку они часто либо автоматически генерируются скриптами сборки, и / или объединяются в один файл на языке ассемблера.
Major (значительное количествоподсистемы неядерного кода) стандартной библиотеки, как правило:
- stdio: в glibc это реализуется библиотекой GNU libio, которая представляет собой унифицированную реализацию C stdio и C ++ iostream, оптимизированную такчто ни один из них не должен замедляться, будучи оберткой для другого.Это большой взлом, и код трудно найти и следовать.Другие реализации (особенно BSD, но также и другие libcs в Linux) намного проще и понятнее для чтения.В конечном счете они основаны на базовых функциях ввода-вывода файлового дескриптора, таких как
open
, read
и т. Д. - Потоки POSIX: в glibc и современных uClibc это NPTL.Я не знаком с реализациями потоков BSD.В других библиотеках Linux либо отсутствуют потоки, либо они предоставляют свои собственные реализации, основанные главным образом на системных вызовах Linux
clone
и futex
. - Математическая библиотека: в конечном счете, почти все они основаны на старом математическом коде Sun, появившемся в начале90-е, но они сильно разошлись.Fdlibm - довольно хорошее базовое приближение кода, используемого в современных библиотеках.
- Поиск пользователя, группы, имени хоста (DNS) и т. Д.: Это выполняется через libnss в glibc и непосредственно в большинстве других библиотек.
- Регулярное выражение и сопоставление глобуса
- Обработка времени и часового пояса
- Перевод языка и набора символов
- Malloc
Если вы хотитеНачните читать источники, я бы рекомендовал не начинать с glibc.Это очень большой и громоздкий.Если вы действительно хотите читать glibc, имейте в виду, что большая часть кода скрывается под деревьями sysdeps и организована на основе разнообразия систем, к которым она применима.
Dietlibc вполне читабелен, но если вы читаете егоисточник, имейте в виду, что он полон типичных ошибок программирования на C (например, при использовании int
, где требуется size_t
, без проверки на переполнение и т. д.).Если вы помните об этом, это не может быть плохим выбором, поскольку игнорирование множества возможных ошибок / сбоев приводит к тому, что код становится очень простым.
С учетом сказанного, для чтения исходного кода libc я бы очень рекомендоваллибо BSD, либо musl (отказ от ответственности: я являюсь основным автором musl, поэтому здесь я немного предвзят).Преимущество BSD в том, что код пространства ядра также чрезвычайно прост и удобочитаем, поэтому, если вы хотите прочитать код ядра с другой стороны системного вызова, вы можете сделать это тоже.