Внутренняя работа стандартной библиотеки C
Я заинтересован во внутренней работе стандартной библиотеки C. Я нашел хорошую книгу о возможной реализации - но я ищу более глубокое объяснение всей стандартной библиотеки и стандартов (например, POSIX) - определения этих стандартов в стандартной библиотеке.
Черновики C очень полезны, но не очень приятны для чтения. Есть ли другая литература на эту тему?
- Standard-Library-PJ-Plauger 1991
- FreeBSD
- GNU человек
- C проект (ы)
Albertus
2 ответа
Хорошей отправной точкой будет 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, но также и другие libcs в Linux) намного проще и понятнее для чтения. В конечном счете они основаны на базовых функциях ввода-вывода файлового дескриптора, таких как
open
,read
, так далее. - Потоки POSIX: На glibc и современных uClibc это NPTL. Я не знаком с реализациями потоков BSD. Другие Linux-библиотеки либо не имеют потоков, либо предоставляют свои собственные реализации, основанные главным образом на Linux
clone
а такжеfutex
Системные вызовы. - Математическая библиотека: в конечном счете, почти все они основаны на старом математическом коде Sun начала 90-х, но они сильно разошлись. Fdlibm - довольно хорошее базовое приближение кода, используемого в современных библиотеках.
- Поиск пользователя, группы, имени хоста (DNS) и т. Д.: Это выполняется через libnss в glibc и напрямую в большинстве других libcs.
- Регулярное выражение и соответствие глобуса
- Время и часовой пояс
- Конвертация локали и кодировки
- Malloc
Если вы хотите начать читать источники, я бы рекомендовал не начинать с glibc. Это очень большой и громоздкий. Если вы действительно хотите читать glibc, имейте в виду, что большая часть кода скрывается под деревьями sysdeps и организована на основе разнообразия систем, к которым она применима.
Dietlibc вполне читабелен, но если вы читаете его источник, имейте в виду, что он полон типичных ошибок программирования на C (например, используя int
где size_t
необходимо, без проверки на переполнение и т. д.). Если вы помните об этом, это может быть не плохим выбором, поскольку игнорирование множества возможных ошибок / сбоев приводит к тому, что код становится очень простым.
С учетом вышесказанного, для чтения исходного кода libc я бы порекомендовал либо один из BSD, либо musl (отказ от ответственности: я являюсь основным автором musl, поэтому здесь я немного предвзят). Преимущество BSD в том, что код пространства ядра также чрезвычайно прост и удобочитаем, поэтому, если вы хотите прочитать код ядра на другой стороне системного вызова, вы можете сделать это тоже.
В книге "C: Справочное пособие, пятое издание" Harbison & Steele вторая часть книги посвящена стандартной библиотеке C (часть 2: главы 10-24).
Обоснование документа для C99 не охватывает библиотеку C, но обоснование ANSI C89 охватывает его главу 4. Здесь есть копия документа: